Ordina una tabella MySQL per due colonne


228

Come posso ordinare una tabella MySQL per due colonne?

Quello che voglio sono gli articoli ordinati per valutazione più alta, poi per data più recente. Ad esempio, questo sarebbe un output di esempio (a sinistra # è la valutazione, quindi il titolo dell'articolo, quindi la data dell'articolo)

50 | Questo articolo oscilla | 4 febbraio 2009
35 | Questo articolo è abbastanza buono | 1 febbraio 2009
5 | Questo articolo non è così caldo | 25 gennaio 2009

L'SQL pertinente che sto usando è:

ORDER BY article_rating, article_time DESC

Posso ordinare l'uno o l'altro, ma non entrambi.

Risposte:


480

L'ordinamento predefinito è crescente, devi aggiungere la parola chiave DESC ad entrambi i tuoi ordini:

ORDER BY article_rating DESC, article_time DESC

Dispari. Quando ho due colonne, il nome e il totale e voglio ordinare in ordine alfabetico per nome e DESC per totale, allora vedo solo che è stato ordinato per nome, ma non per totale
Eugene,

Ho hackerato con (-1) * field1, field2 senza motivo sui campi numerici ... grazie.
Asad Hasan,

ahahah .... non è una buona query, perché se ci provi, non potrai mai riordinare la categoria di valori "vuoti" ... bel tentativo nel 2009 .. ma nel 2015 non funzionano correttamente;), Il corretto è "3 "o" 2 "
sottoquery

Tale query non funziona nel mio caso. In questo caso, non ottengo l'ordinamento per Città selezionare Città distinta, Paese dall'ordine dei clienti per Paese descrizione, Città descrizione;
Pra_A,

4
Non so perché questo sia verificato come risposta, ma non lo è. Ordina per prima colonna e poi seconda ma non entrambe allo stesso tempo.
aidonsnous,

34
ORDER BY article_rating, article_time DESC

ordinerà per article_time solo se ci sono due articoli con la stessa valutazione. Da tutto quello che posso vedere nel tuo esempio, questo è esattamente ciò che accade.

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 4, 2009    3.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

ma considera:

 primary sort                         secondary sort 
1.  50 | This article rocks          | Feb 2, 2009    3.
1.  50 | This article rocks, too     | Feb 4, 2009    4.
2.  35 | This article is pretty good | Feb 1, 2009    2.
3.  5  | This Article isn't so hot   | Jan 25, 2009   1.

Questa risposta mi ha aiutato.Grazie @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCalla fine ordinerà per entrambe le colonne in ordine decrescente. Devi specificare ASCse lo desideri altrimenti


8

Questo forse aiuta qualcuno che sta cercando il modo di ordinare la tabella per due colonne, ma in modo parallelo. Ciò significa combinare due tipi utilizzando la funzione di ordinamento aggregato. È molto utile, ad esempio, per recuperare articoli utilizzando la ricerca full-text e anche per quanto riguarda la data di pubblicazione dell'articolo.

Questo è solo un esempio, ma se catturi l'idea puoi trovare molte funzioni aggregate da usare. Puoi persino ponderare le colonne per preferirne una rispetto al secondo. La mia funzione prende estremi da entrambi i tipi, quindi le file più apprezzate sono in cima.

Scusate se esistono soluzioni più semplici per fare questo lavoro, ma non ne ho trovate.

SELECT
 `id`,
 `text`,
 `date`
 FROM
   (
   SELECT
     k.`id`,
     k.`text`,
     k.`date`,
     k.`match_order_id`,
     @row := @row + 1 as `date_order_id`
     FROM
     (
       SELECT
         t.`id`,
         t.`text`,
         t.`date`,
         @row := @row + 1 as `match_order_id`
         FROM
         (
           SELECT
             `art_id` AS `id`,
             `text`   AS `text`,
             `date`   AS `date`,
             MATCH (`text`) AGAINST (:string) AS `match`
             FROM int_art_fulltext
             WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE)
             LIMIT 0,101
         ) t,
         (
           SELECT @row := 0
         ) r
         ORDER BY `match` DESC
     ) k,
     (
       SELECT @row := 0
     ) l
     ORDER BY k.`date` DESC
   ) s
 ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC

34
oddio, perché pubblichi questo codice per una domanda così semplice.
Ben Sinclair,

4

Di seguito verranno ordinati i dati in base a entrambe le colonne in ordine decrescente.

ORDER BY article_rating DESC, article_time DESC

3
In che modo una copia della risposta accettata 4 anni dopo riceve così tanti voti positivi?
Stack Underflow,

potrebbe essere a causa di spiegazioni: P
Rizwan Haider,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.