MYSQL 用户自定义变量问题

MYSQL User Defined Variable Issue

我正在尝试计算用户上次登录和现在之间的评论数量。我正在使用 knex,但试图让它在一个语句中工作,而不首先在 MYSQL 顶部设置。

这就是我要查找的内容,但它没有返回正确的 COUNT。该语句似乎没有在 WHERE BETWEEN 语句中使用 @lastlogin 变量,但我不明白为什么。

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;

虽然要回答你的问题是双重的

  1. 用户变量必须先初始化才能使用。这可以在 cross join (Select @LastLogin:=Now())
  2. 中完成
  3. SQL 的操作顺序不是自上而下。因此,在您的情况下,where 子句在 select 之前执行,因此用户变量尚未初始化。 SQL这种情况下的操作顺序是FROM,Right Join,其中,Select...Select是最后执行的操作。所以执行 where 子句时 @LastLogin 不在范围内。