不应该@prev<> (@prev:= Score)总是假的?

时间:2015-08-18 13:33:27

标签: mysql

我有一个名为Scores的表格:

mysql> select * from Scores;
+------+-------+
| Id   | Score |
+------+-------+
|    1 |   3.5 |
|    2 |  3.65 |
|    3 |     4 |
|    4 |  3.85 |
|    5 |     4 |
|    6 |  3.65 |
+------+-------+
6 rows in set (0.00 sec)

执行以下SQL:

SELECT
    Score,
    @prev <> (@prev := Score) Res
FROM
    Scores,
    (SELECT @prev := -1) init
ORDER BY Score desc

得到结果:

+-------+------+
| Score | Res  |
+-------+------+
|     4 |    1 |
|     4 |    0 |
|  3.85 |    1 |
|  3.65 |    1 |
|  3.65 |    0 |
|   3.5 |    1 |
+-------+------+
6 rows in set (0.00 sec)

请注意此部分@prev <> (@prev := Score),我已将Score分配给@prev,因此@prev应始终等于(@prev := Score)(就像@prev一样等于@prev),因此@prev <> (@prev := Score)的结果应始终为0,为什么结果集中有1个?

1 个答案:

答案 0 :(得分:1)

部分@prev <> (@prev := Score)从左到右进行解析,因此第一个@prev仍然具有其先前的值,因为这是预期的,然后才会为其分配新值。