2009-02-05 13 views
156

Wie sortiere ich eine MySQL-Tabelle nach zwei Spalten?PHP MySQL Order by Two Columns

Was ich will sind Artikel sortiert nach höchsten Bewertungen zuerst, dann neueste Datum. Als Beispiel wäre dies eine Probe ausgegeben werden (links # ist die Bewertung, dann der Titel des Artikels, dann wird der Artikel Datum)

 
50 | This article rocks   | Feb 4, 2009 
35 | This article is pretty good | Feb 1, 2009 
5 | This Article isn't so hot | Jan 25, 2009 

Die entsprechende SQL Ich verwende ist:

ORDER BY article_rating, article_time DESC 

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

Antwort

340

Standardsortierung aufsteigend ist, müssen Sie das Schlüsselwort DESC, um sowohl Ihre Aufträge hinzuzufügen:

ORDER BY article_rating DESC, article_time DESC 
+0

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

+0

. Ich wusste nicht, dass das möglich war! Exxelent! :) – teecee

+0

Ich hackte mit (-1) * field1, field2 ohne Grund auf numerische Felder ... danke. –

7
ORDER BY article_rating ASC , article_time DESC 

DESC am Ende von beiden Spalten sortieren, wird absteigend. Sie haben ASC angeben, wenn Sie es anders wollen

20
ORDER BY article_rating, article_time DESC 

wird sortieren, indem article_time nur, wenn es zwei mit demselben Rating. Von allem, was ich in deinem Beispiel sehen kann, passiert genau das.

↓ 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:

↓ 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. 
6

Dies vielleicht jemanden helfen, die für die Art und Weise sucht Tabelle mit zwei Spalten zu sortieren, aber in paralel Art und Weise. Dies bedeutet, dass zwei Sortierungen mithilfe der Aggregatsortierfunktion kombiniert werden. Es ist sehr nützlich, wenn Sie zB Artikel mit der Volltextsuche abrufen und auch das Veröffentlichungsdatum des Artikels.

Dies ist nur ein Beispiel, aber wenn Sie die Idee verstehen, können Sie eine Menge von Aggregatfunktionen zu verwenden finden. Sie können sogar die Spalten gewichten, um eine Sekunde vorzuziehen. Die Funktion von mir nimmt Extreme von beiden Arten, also sind die am meisten geschätzten Reihen auf der Oberseite.

Entschuldigung, wenn es einfachere Lösungen gibt, um diesen Job zu erledigen, 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 
+18

Oh mein Gott, warum postest du solchen Code für so eine einfache Frage. – Andy

2

Im Folgenden werden Ihre Daten abhängig von beiden Spalten in absteigender Reihenfolge sortiert.

ORDER BY article_rating DESC, article_time DESC