2015-08-18 2 views
2

У меня есть таблица с именем Scores:Должно ли @prev <> (@prev: = Score) всегда быть ложным?

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) (Jus t like @prev должен всегда равняться @prev), поэтому результат @prev <> (@prev := Score) всегда должен быть 0, почему в результирующем наборе есть несколько 1?

+1

Check: [SQL Fiddle] (http://sqlfiddle.com/#!9/10b63c/1). Помните: 'Для других операторов, таких как SELECT, вы можете получить ожидаемые результаты, но это не гарантируется. ... порядок оценки выражений с пользовательскими переменными не определен. 'См .: [9.4 Пользовательские переменные] (https://dev.mysql.com/doc/refman/5.6/en/user-variables.html) , – wchiquito

ответ

1

Элемент @prev <> (@prev := Score) разобран слева направо, поэтому первый @prev по-прежнему имеет свое предыдущее значение, поскольку это предназначено, и только после этого ему присваивается новое значение.

Смежные вопросы