我尝试使用局部变量来保存用户计数的值,以便计算当前计数与之前计数之间的比率。
我使用这个查询:
SET @count = 0;
SELECT DATE_FORMAT(ual.time, "%M, %Y") as monthName,
@count as beforeCount,
count(DISTINCT ual.user_id)/@count as progress,
@count := count(DISTINCT ual.user_id) as afterCount
FROM user_activity_log ual
LEFT OUTER JOIN user u
ON u.gym = 22
LEFT OUTER JOIN (SELECT ualWeek.user_id FROM user_activity_log ualWeek
GROUP BY FROM_DAYS(TO_DAYS(ualWeek.time) -MOD(TO_DAYS(ualWeek.time) -1, 7)), ualWeek.user_id
HAVING count(ualWeek.user_id) > 1) weekUsers
ON u.id = weekUsers.user_id
LEFT OUTER JOIN (SELECT ualMonth.user_id FROM user_activity_log ualMonth
GROUP BY DATE(DATE_FORMAT(ualMonth.time, "%Y-%m-01")), ualMonth.user_id
HAVING count(ualMonth.user_id) > 5) monthUsers
ON u.id = monthUsers.user_id
WHERE
(ual.user_id = weekUsers.user_id OR ual.user_id = monthUsers.user_id) AND
((ual.time BETWEEN '2014-02-13' AND '2015-02-13') OR (('2014-02-13' IS NULL) OR ('2015-02-13' IS NULL)))
GROUP BY DATE(DATE_FORMAT(ual.time, "%Y-%m-01"))
我的问题是@count
不更新自己。
这是我的结果:
如果我编辑我的查询并删除我的联接,它工作正常。 新的查询:
SET @count = 0;
SELECT DATE_FORMAT(ual.time, "%M, %Y") as monthName,
@count as beforeCount,
count(DISTINCT ual.user_id)/@count as progress,
@count := count(DISTINCT ual.user_id) as afterCount
FROM user_activity_log ual
WHERE
((ual.time BETWEEN '2014-02-13' AND '2015-02-13') OR (('2014-02-13' IS NULL) OR ('2015-02-13' IS NULL)))
GROUP BY DATE(DATE_FORMAT(ual.time, "%Y-%m-01"))
- 我的问题是为什么会发生这种情况以及如何保留我的加入并仍然保留我的
@counter
最佳答案
通过 SELECT 语句,您使用它的方式无法保证用户定义变量的行为。
摘自MySQL 5.5引用手册的“9.4用户定义变量”部分
For other statements, such as SELECT, you might get the results you expect, but this is not guaranteed. In the following statement, you might think that MySQL will evaluate @a first and then do an assignment second:
SELECT @a, @a:=@a+1, ...;
However, the order of evaluation for expressions involving user variables is undefined.
引用:http://dev.mysql.com/doc/refman/5.5/en/user-variables.html
<小时/>您可以尝试(不保证)使用括号中的联接包装您的 SELECT,并将其用作另一个查询的内联 View 。至少到版本 5.5 为止,该查询的结果被具体化为派生表,并且外部查询针对该表运行。
该方法是将结果集准备到派生表中,然后运行使用用户定义变量的外部查询,以“保留”前一行的值。再次强调,不能保证,但这可能对您有用:
SELECT DATE_FORMAT(d.dt, '%M, %Y') AS monthName
, d.cnt/@prev_count AS progress
, @prev_count := d.cnt AS cnt
FROM ( SELECT @prev_count := 0 ) i
JOIN ( SELECT DATE(DATE_FORMAT(ual.time, '%Y-%m-01')) AS dt
, COUNT(DISTINCT ual.user_id) AS cnt
FROM user_activity_log ual
LEFT
JOIN user u
ON u.gym = 22
LEFT
JOIN ( SELECT ualWeek.user_id
FROM user_activity_log ualWeek
GROUP
BY FROM_DAYS(TO_DAYS(ualWeek.time) -MOD(TO_DAYS(ualWeek.time) -1, 7))
, ualWeek.user_id
HAVING COUNT(ualWeek.user_id) > 1
) weekUsers
ON weekUsers.user_id = u.id
LEFT
JOIN ( SELECT ualMonth.user_id
FROM user_activity_log ualMonth
GROUP
BY DATE(DATE_FORMAT(ualMonth.time, '%Y-%m-01'))
, ualMonth.user_id
HAVING COUNT(ualMonth.user_id) > 5
) monthUsers
ON monthUsers.user_id = u.id
WHERE (ual.user_id = weekUsers.user_id OR ual.user_id = monthUsers.user_id)
AND ((ual.time BETWEEN '2014-02-13' AND '2015-02-13') OR (('2014-02-13' IS NULL) OR ('2015-02-13' IS NULL)))
GROUP BY DATE(DATE_FORMAT(ual.time, '%Y-%m-01'))
ORDER BY DATE(DATE_FORMAT(ual.time, '%Y-%m-01'))
) d
关于Mysql 局部变量没有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507121/