2011-10-11 12 views
8

Mam pytanie natknąłem się na interesujący kawałek kodu. W oświadczeniu MySQL istnieje coś takiego jak:ORDER BY i = (równe) w MYSQL

{...} Zamów przez jakiegokolwiek = 3 ASC, cokolwiek = 4 ASC, cokolwiek = 6 ASC {...}

Czy to znaczy, że będzie zamówić w ten sposób ?:

thing | whatever 
15 | 1 
1  | 3 
5  | 3 
8  | 3 
2  | 4 
3  | 4 
6  | 4 
4  | 6 
7  | 6 
9  | 6 
14 | 9 
21 | 10 
18 | 9 
... 

wydaje się być sortowanie tylko cokolwiek który równy 3,4 i 6 reszta jest nieuporządkowana ...

Czy to właściwa składnia/obsługiwane?

Odpowiedz

7

whatever=3 ocenia jako logiczną z 0 jako fałszywe i 1 jako true.

Ponieważ jest on sortowany rosnąco, te, które nie spełniają warunku zostaną zamówione jako pierwsze. Następnie wchodzi w grę druga kolumna zamawiająca whatever=4, w której whatever=4 będzie ostatnia w tej grupie i tak dalej.

W przypadku, gdy whatever nie jest w (3,4,6) żadne zamówienie nie zostało określone jako zasada rozstrzygająca, a zamawianie jest arbitralne.

Jest obsługiwana w MySQL, ale nie w wersji standardowej lub przenośnej.

+0

'Bo to jest uporządkowane rosnąco te nie spełnienia warunku zostanie uporządkowane first'? Proszę wyjaśnić, dlaczego to jest pierwsze? Po pierwsze, czy masz na myśli pojawienie się na szczycie? –

+1

@GhazanfarMir Ponieważ sortuje wartości "0" i "1" rosnąco. '0' jest na pierwszym miejscu (tak, na górze). –

+0

@downvoter - Jakiś problem z tą odpowiedzią? Proszę wytłumacz! –

1

Właściwie to zamawia przez wynik porównania, która jest logiczna wartość 0 lub 1. Otrzymany kod jest coś takiego jak (pseudo-kod):

ORDER BY 
    CASE whatever = 3 THEN 1 ELSE 0 
    ASC, 
    CASE whatever = 4 THEN 1 ELSE 0 
    ASC 

co w końcu chodzi o (jeżeli wartość jest na liście),

ORDER BY 0,0,1 
ORDER BY 0,1,0 

i jeśli wartość nie znajduje się na liście:

ORDER BY 0,0,0 

Więc wartości s, które nie znajdują się na liście, są traktowane z tą samą wartością i nie są zamawiane, a wartości na liście są sortowane na podstawie pozycji na liście.

Można zastąpić to z ORDER BY FIELD(whatever, 3,4,6) (documentation)