Obecnie wykonuję bardzo proste OrderBy w moim oświadczeniu.
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
Problem polega na tym, że wpisy NULL dla „pozycji” są traktowane jako 0. Dlatego wszystkie wpisy z pozycją NULL pojawiają się przed tymi z 1,2,3,4. na przykład:
NULL, NULL, NULL, 1, 2, 3, 4
Czy istnieje sposób na uzyskanie następującej kolejności:
1, 2, 3, 4, NULL, NULL, NULL.
mysql
sql-order-by
JonB
źródło
źródło
Odpowiedzi:
MySQL ma nieudokumentowaną składnię do sortowania wartości zerowych na końcu. Umieść znak minus (-) przed nazwą kolumny i przełącz ASC na DESC:
Jest to zasadniczo odwrotność
position DESC
umieszczania wartości NULL na końcu, ale poza tym taka sama jakposition ASC
.Dobry odnośnik znajduje się tutaj http://troels.arvin.dk/db/rdbms#select-order_by
źródło
- col_name
jest wyrażeniem (0 - col_name
), które akceptuje klauzula ORDER BY. Oczywiście działa to tylko w przypadku kolumn numerycznych.date
itime
kolumny też! (MySQL 5.5). Chyba (jestem leniwy, aby sprawdzić) to działa dla wszystkich kolumn podobnych do liczb (znacznik czasu, liczba zmiennoprzecinkowa ...).Uważam, że jest to dobre rozwiązanie w przeważającej części:
źródło
SELECT * FROM table ORDER BY ISNULL(field) ASC;
(MySQL 5.5)NULLS LAST
|NULLS FIRST
odwrócić to zamiast obejść tutaj.Coś jak
Zamień 999999999 na dowolną maksymalną wartość dla tego pola
źródło
NULL LAST
źródło
Możesz zamienić wystąpienia NULL z inną wartością, aby posortować je najpierw (np. 0 lub -1) lub ostatnie (duża liczba lub litera) ...
źródło
Spróbuj użyć tego zapytania:
źródło
Możesz połączyć swoje wartości NULL w
ORDER BY
zestawieniu:Jeśli chcesz, aby wartości NULL były sortowane na dole, spróbuj
coalesce(position, 100000)
. (Zrób drugą liczbę większą niż wszystkie inneposition
w db.)źródło
źródło
Do
DATE
kolumny możesz użyć:NULLS ostatnie:
Ostatnie puste miejsca:
źródło
Aby osiągnąć następujący wynik:
1, 2, 3, 4, NULL, NULL, NULL.
UŻYJ składni, umieść
-(minus sign)
przed nazwą pola i użyj odwrotnego typu_pole (np .: jeśli chcesz zamówić według kolejności ASC, użyj DESC lub jeśli chcesz zamówić DESC, użyj ASC)SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC
źródło
To działa dobrze:
źródło
Dlaczego nie zamawiasz przez NULLS LAST?
źródło
NULLS LAST
- jaką wersję MySQL wprowadzono?