Я пытаюсь получить подсчет количества отзывов между в последний раз, когда пользователь вошел в систему и теперь. Я использую 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 не поддерживает ни одно из них, хотя...
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;
Чтобы ответить на ваш вопрос, но в два раза
cross join (Select @LastLogin:=Now())