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;
虽然要回答你的问题是双重的
- 用户变量必须先初始化才能使用。这可以在
cross join (Select @LastLogin:=Now())
中完成
- SQL 的操作顺序不是自上而下。因此,在您的情况下,where 子句在 select 之前执行,因此用户变量尚未初始化。 SQL这种情况下的操作顺序是FROM,Right Join,其中,Select...Select是最后执行的操作。所以执行 where 子句时 @LastLogin 不在范围内。
我正在尝试计算用户上次登录和现在之间的评论数量。我正在使用 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;
虽然要回答你的问题是双重的
- 用户变量必须先初始化才能使用。这可以在
cross join (Select @LastLogin:=Now())
中完成
- SQL 的操作顺序不是自上而下。因此,在您的情况下,where 子句在 select 之前执行,因此用户变量尚未初始化。 SQL这种情况下的操作顺序是FROM,Right Join,其中,Select...Select是最后执行的操作。所以执行 where 子句时 @LastLogin 不在范围内。