MYSQL Пользовательская переменная проблема

0

Я пытаюсь получить подсчет количества отзывов между в последний раз, когда пользователь вошел в систему и теперь. Я использую knex, но пытаюсь заставить это работать в одном выражении без SET сверху в MYSQL.

Это то, что я ищу, но он не возвращает правильный COUNT. Утверждение, похоже, не использует переменную @lastlogin в инструкции WHERE BETWEEN, но я не могу понять, почему.

SELECT Count(*), @lastlogin := (SELECT DATE(userLastLogin) FROM users WHERE users.UID = 50) AS login
FROM reviews
RIGHT JOIN schools on schools.SID = reviews.schoolID
WHERE reviews.dateCreated BETWEEN @lastlogin AND NOW()
AND reviews.active = 1;

Если я использую это, это сработает.

SET @lastlogin = (SELECT DATE(userLastLogin) FROM users WHERE users.UID = 50);
SELECT Count(*)
FROM reviews
RIGHT JOIN schools on schools.SID = reviews.schoolID
WHERE reviews.dateCreated BETWEEN @lastlogin AND NOW()
AND reviews.active = 1

Если я пишу дату явно в BETWEEN, он работает.

Почему он не работает с определением переменной в SELECT?

Если бы я просто использовал MYSQL, все было бы хорошо, но мне нужно, чтобы переменная была установлена в SELECT для Knex.js.

Теги:
knex.js

1 ответ

1
Лучший ответ

Зачем нужна переменная пользователя? Возможно, knex.js не поддерживает ни одно из них, хотя...

SELECT Count(*)
FROM reviews
RIGHT JOIN schools on schools.SID = reviews.schoolID
WHERE reviews.dateCreated BETWEEN (SELECT DATE(userLastLogin) 
                                   FROM users 
                                   WHERE users.UID = 50) AND NOW()
  AND reviews.active = 1;

Или если вам почему-то нужна переменная пользователя... Может быть.

SELECT Count(*), @LastLogin
FROM reviews
RIGHT JOIN schools on schools.SID = reviews.schoolID
CROSS JOIN (SELECT @LastLogin:=(SELECT DATE(userLastLogin) 
                                   FROM users 
                                   WHERE users.UID = 50))
WHERE reviews.dateCreated BETWEEN @LastLogin  AND NOW()
  AND reviews.active = 1;

Чтобы ответить на ваш вопрос, но в два раза

  1. Перед использованием пользовательская переменная должна быть инициализирована. Это может быть выполнено в cross join (Select @LastLogin:=Now())
  2. Порядок операций SQL не сверху вниз. Поэтому в вашем случае предложение where выполняется до выбора, чтобы пользовательская переменная еще не была инициализирована. Порядок работы SQL в этом случае - FROM, Right Join, Where, Select... Select - последняя выполняемая операция. Поэтому @LastLogin не входит в область действия, когда выполняется предложение where.
  • 0
    Когда я вижу это сейчас, вы правы! Я не понимал, что мог бы поместить оператор SELECT в качестве параметра BETWEEN. Ваше объяснение порядка операций очень помогает. Оба варианта отлично сработали!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню