Mysql 局部变量没有更新

标签 mysql

我尝试使用局部变量来保存用户计数的值,以便计算当前计数与之前计数之间的比率。

我使用这个查询:

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不更新自己。 这是我的结果: enter image description here

如果我编辑我的查询并删除我的联接,它工作正常。 新的查询:

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"))

enter image description here

  • 我的问题是为什么会发生这种情况以及如何保留我的加入并仍然保留我的 @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/

相关文章:

MySQL:VIEW 语句:使用 View 和聚合函数

mysql - 使用 MySQL 几何函数时出现 SQL 错误

mysql - 当我在非唯一列中设置外键关系时,GROUP BY 不起作用

php - 使用PHP存储点击的链接数据并将其传输到新页面

php - 先删除表中的所有记录,然后在表中插入新记录 Wordpress SQL 查询

mysql - 在我的 mysql 表中输入 ID

php - 更改输入格式和数据库问题

mysql - 基准测试 INNER JOIN 与 SUBSELECT

php - 在PHP中列出所有评论并获取另一个表的作者的用户名

php - 如何在php中自动执行查询