Ordnen Sie eine MySQL-Tabelle nach zwei Spalten


228

Wie sortiere ich eine MySQL-Tabelle nach zwei Spalten?

Was ich möchte, sind Artikel, die zuerst nach den höchsten Bewertungen und dann nach dem letzten Datum sortiert sind. Dies wäre beispielsweise eine Beispielausgabe (links # ist die Bewertung, dann der Artikeltitel und dann das Artikeldatum).

50 | Dieser Artikel rockt | 4. Februar 2009
35 | Dieser Artikel ist ziemlich gut 1. Februar 2009
5 | Dieser Artikel ist nicht so heiß 25. Januar 2009

Das relevante SQL, das ich verwende, ist:

ORDER BY article_rating, article_time DESC

Ich kann nach dem einen oder anderen sortieren, aber nicht nach beiden.

Antworten:


480

Die Standardsortierung ist aufsteigend. Sie müssen das Schlüsselwort DESC zu Ihren beiden Bestellungen hinzufügen:

ORDER BY article_rating DESC, article_time DESC

Seltsam. Wenn ich zwei Spalten habe, den Namen und die Gesamtsumme und alphabetisch nach Namen und DESC nach Gesamtsumme sortieren möchte, dann sehe ich nur, dass es nach Namen sortiert wurde, aber nicht nach Gesamtsumme
Eugene

Ich habe ohne Grund mit (-1) * Feld1, Feld2 auf numerischen Feldern gehackt ... danke.
Asad Hasan

hahaha .... nicht ist eine gute Abfrage, denn wenn Sie es versuchen, können Sie die "leere" Wertekategorie nie neu ordnen ... netter Versuch im Jahr 2009 .. aber im Jahr 2015 funktioniert nicht richtig;), Das richtige ist "3
Unterabfrage

Eine solche Abfrage funktioniert in meinem Fall nicht. In diesem Fall wird keine Sortierung nach Stadt durchgeführt. Wählen Sie eine bestimmte Stadt, ein Land aus der Kundenreihenfolge nach Land ab, Stadt ab;
Pra_A

4
Ich weiß nicht, warum dies als Antwort überprüft wird, ist es aber nicht. Es sortiert nach der ersten Spalte, dann nach der zweiten, aber nicht nach beiden gleichzeitig.
Aidonsnous

34
ORDER BY article_rating, article_time DESC

wird nur nach article_time sortiert, wenn zwei Artikel mit derselben Bewertung vorhanden sind. Nach allem, was ich in Ihrem Beispiel sehen kann, passiert genau dies.

 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.

aber bedenken Sie:

 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.

Diese Antwort hat mir geholfen. Danke @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCam Ende wird nach beiden Spalten absteigend sortiert. Sie müssen angeben, ASCob Sie es anders wollen


8

Dies kann vielleicht jemandem helfen, der nach einer Möglichkeit sucht, Tabellen nach zwei Spalten zu sortieren, jedoch parallel. Dies bedeutet, zwei Sortierungen mithilfe der aggregierten Sortierfunktion zu kombinieren. Dies ist sehr nützlich, wenn Sie beispielsweise Artikel mithilfe der Volltextsuche abrufen und das Veröffentlichungsdatum des Artikels angeben.

Dies ist nur ein Beispiel, aber wenn Sie auf die Idee kommen, finden Sie viele Aggregatfunktionen, die Sie verwenden können. Sie können die Spalten sogar gewichten, um eine gegenüber der Sekunde zu bevorzugen. Die Funktion von mir nimmt Extreme von beiden Arten, daher sind die am meisten geschätzten Zeilen oben.

Es tut mir leid, wenn es einfachere Lösungen für diesen Job gibt, aber ich habe keine gefunden.

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
Oh mein Gott, warum postest du so einen Code für eine so einfache Frage?
Ben Sinclair

4

Im Folgenden werden Ihre Daten in Abhängigkeit von beiden Spalten in absteigender Reihenfolge sortiert.

ORDER BY article_rating DESC, article_time DESC

3
Wie erhält eine Kopie der akzeptierten Antwort 4 Jahre später so viele positive Stimmen?
Stack Underflow

kann wegen der Erklärung sein: P
Rizwan Haider
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.