2016-01-07 3 views
0

Вчера я задал вопрос о ранжировании студентов по их баллам.Почему нулевые значения не одинаковы в mysql?

[Rank users in mysql by their points ]

Я на самом деле решить мою проблему с помощью я полученного от другого вопроса (спасибо всем, кто помог мне).
Между тем я что-то обнаружил случайно. Если я попытаюсь ранжировать своих учеников по их точкам, и если столбец точек был пуст (NULL), мой запрос не дал ошибку, он также отсортировал ранжировки как 1-2-3-4, но все значения были NULL

это вопрос, который я пробовал

select er.*, 
     (@rank := if(@points = points, 
        @rank, 
        if(@points := points,  
         @rank + 1, 
         @rank + 1      
        ) 
        )     
     ) as ranking 
from examresults er cross join 
    (select @rank := 0, @points := -1) params 
order by points desc; 

и это результат.

enter image description here

Так интересно Арент NULL значения одинаковы? isnt этот запрос должен был дать rank 1 для каждого пользователя в моей базе? почему он равномерно поменяет значения null?

ответ

4

Многие люди думают о NULL как значения no value или non-existent. Даже Wikipedia объясняет это так.

Думайте об этом как unknown value, и все будет иметь смысл.

Нельзя сравнить два unknown values, потому что, ну, они не известны. Они не равны, но они также не отличаются. Ни один из них больше, чем другой.

Результат сравнения двух unknown values также является unknown value (то есть NULL).

+1

теперь все имеет смысл благодаря объяснению! –

+0

невозможно спорить с этим ответом! Я думаю, вам нужно отредактировать сообщение в Википедии. – davejal

+0

Ну, для тех пациентов, которые достаточно читают, на странице Википедии также говорится (в третьем абзаце): * «SQL null - это состояние (неизвестно), а не значение». *. – axiac

2

Вы сравниваете @points = points, результатом которого является @points=NULL.

Но ни в какое сравнение с NULL результатов в UNKNOWN:

value= NULL -> UNKNOWN 
value<>NULL -> UNKNOWN 
value< NULL -> UNKNOWN 
value> NULL -> UNKNOWN 

Даже NULL=NULL результаты в UNKNOWN.

Конечно, есть исключения:

DISTINCT и GROUP BY считают NULLs равной.

+0

Привет, то почему я не ПОЛУЧАТЬ ошибки, такие, как вы не можете сравнить нуль с нулем? –

+1

@Rodrane: Потому что вы не используете литерал NULL, а параметр и столбец. – dnoeth

+1

@Rodrane Это не ошибка. Добро пожаловать в ** [3-значная логика] (https://en.wikipedia.org/wiki/Ternary_logic) **. – lad2025

2

NULL не имеет значения - это состояние небытия. Таким образом, любые результаты, основанные на NULL, не являются детерминированными. Вы должны ОСУЩЕСТВЛЯТЬ возможность использования значений NULL.

1

Логическое сравнение return true, false, или NULL, и NULL обычно рассматривается как ложное. Вы можете легко изменить запрос, чтобы использовать NULL -safe равенство:

select er.*, 
     (@rank := if(@points <=> points, 
        @rank, 
        if(@points := points,  
         @rank + 1, 
         @rank + 1      
        ) 
        )     
     ) as ranking 
from examresults er cross join 
    (select @rank := 0, @points := -1) params 
order by points desc; 
Смежные вопросы