Sök…


sammanhang

Klausulerna i SELECT har en specifik ordning:

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ...
    ORDER BY ...  -- goes here
    LIMIT ... OFFSET ...;

( SELECT ... ) UNION ( SELECT ... ) ORDER BY ...  -- for ordering the result of the UNION.

SELECT ... GROUP_CONCAT(DISTINCT x ORDER BY ... SEPARATOR ...) ...

ALTER TABLE ... ORDER BY ... -- probably useful only for MyISAM; not for InnoDB

Grundläggande

BESTÄLL AV x

x kan vara vilken datatyp som helst.

  • NULLs föregår icke-NULL.
  • Standard är ASC (lägst till högst)
  • Strängar ( VARCHAR , etc) beställs enligt COLLATION av deklarationen
  • ENUMs beställs enligt deklarationsordern för dess strängar.

Stigande fallande

ORDER BY x ASC  -- same as default
ORDER BY x DESC  -- highest to lowest
ORDER BY lastname, firstname  -- typical name sorting; using two columns
ORDER BY submit_date DESC  -- latest first
ORDER BY submit_date DESC, id ASC  -- latest first, but fully specifying order.
  • ASC = ASCENDING , DESC = DESCENDING
  • NULLs kommer först även för DESC .
  • I exemplen ovan kan INDEX(x) , INDEX(lastname, firstname) , INDEX(submit_date) avsevärt förbättra prestandan.

Men ... Att blanda ASC och DESC , som i det sista exemplet, kan inte använda ett sammansatt index för att dra nytta av. INDEX(submit_date DESC, id ASC) hjälper inte heller - " DESC " identifieras syntaktiskt i INDEX deklarationen, men ignoreras.

Några knep

ORDER BY FIND_IN_SET(card_type, "MASTER-CARD,VISA,DISCOVER") -- sort 'MASTER-CARD' first.
ORDER BY x IS NULL, x  -- order by `x`, but put `NULLs` last.

Anpassad beställning

SELECT * FROM some_table WHERE id IN (118, 17, 113, 23, 72) 
ORDER BY FIELD(id, 118, 17, 113, 23, 72);

Returnerar resultatet i den angivna id-ordningen.

id ...
118 ...
17 ...
113 ...
23 ...
72 ...

Användbart om ID: erna redan är sorterade och du bara behöver hämta raderna.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow