SELECT
@x := (600 - COUNT(h.challenge_user_historyID)) / 180 AS x,
CASE
WHEN (1 > 2)
THEN 25
ELSE
1 + @x
END AS priority,
COUNT(h.challenge_user_historyID) AS n_games_actual
FROM campaigns c
LEFT JOIN challenge_user_history h
ON (c.challengeID = h.challengeID)
GROUP BY c.campaignID
ORDER BY
priority DESC;
+-------------+------------------+----------------+
| x | priority | n_games_actual |
+-------------+------------------+----------------+
| 3.000000000 | 4.11110000000000 | 60 |
| 3.222222222 | 4.11110000000000 | 20 |
| 3.333333333 | 4.11110000000000 | 0 |
| 3.111111111 | 4.11110000000000 | 40 |
| 2.777777777 | 4.11110000000000 | 100 |
+-------------+------------------+----------------+
对我来说似乎很奇怪。如果它正确地获得了n_games_actual
的COUNT()
在评估x
中的值(如输出中的X值所示(,那么为什么在优先级进行基本相同的计算时会出错?怎么能纠正?
谢谢。
很棒的问题,查询的行为是出乎意料的,但这不是错误。
似乎正在发生的情况是在查询期间未设置@x
。仅在计算完成后设置。它设置为计算的最后一行,请注意,这可能与结果中的最后一行不同,因为有一个ORDER BY
子句在返回结果之前会改变顺序。
可以创建其他查询,其中当查询执行时,变量的值每行更新。
关键是MySQL对何时在查询中设置变量时没有任何承诺。用户定义的变量文档状态:
作为一般规则,除了在设置语句中,您绝对不应为用户变量分配值并在同一语句中读取值。
和
涉及用户变量的表达式评估顺序未定义。
因此,您需要更改查询以避免设置和读取相同的变量,并且应该按预期工作。