Zamów tabelę MySQL według dwóch kolumn


228

Jak posortować tabelę MySQL według dwóch kolumn?

Chcę, aby artykuły były sortowane najpierw według najwyższych ocen, a następnie według najnowszych dat. Na przykład byłby to przykładowy wynik (lewy # to ocena, następnie tytuł artykułu, a następnie data artykułu)

50 | Ten artykuł kołysze | 4 lutego 2009 r
35 | Ten artykuł jest całkiem dobry | 1 lutego 2009 r
5 | Ten artykuł nie jest taki gorący | 25 stycznia 2009 r

Odpowiedni SQL, którego używam to:

ORDER BY article_rating, article_time DESC

Mogę sortować według jednego lub drugiego, ale nie obu.

Odpowiedzi:


480

Domyślne sortowanie jest rosnące, należy dodać słowo kluczowe DESC do obu zamówień:

ORDER BY article_rating DESC, article_time DESC

Dziwny. Kiedy mam dwie kolumny, nazwę i sumę i chcę uporządkować alfabetycznie według nazwy i DESC według sumy, to widzę tylko, że to było uporządkowane według nazwy, ale nie razem
Eugene

Hakowałem za pomocą (-1) * field1, field2 bez powodu na polach numerycznych ... dzięki.
Asad Hasan

hahaha .... nie jest dobrym zapytaniem, ponieważ jeśli spróbujesz, nigdy nie będzie można zmienić kolejności kategorii „pustych” wartości ... fajna próba w 2009 r. .. ale w 2015 r. nie działa poprawnie;), Prawidłowe jest „3 zapytanie podrzędne „lub” 2
wyślij

Takie zapytanie nie działa w moim przypadku. W tym przypadku nie otrzymuję sortowania według miasta, wybierz odrębne miasto, kraj od zamówienia klientów według kraju, miasto;
Pra_A

4
Nie wiem, dlaczego jest to sprawdzane jako odpowiedź, ale tak nie jest. Sortuje według pierwszej kolumny, a następnie drugiej, ale nie obu naraz.
pomocny

34
ORDER BY article_rating, article_time DESC

posortuje według article_time tylko wtedy, gdy są dwa artykuły o tej samej ocenie. Z tego, co widzę w twoim przykładzie, dokładnie tak się dzieje.

 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.

ale zastanów się:

 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.

Ta odpowiedź pomogła mi. Dzięki @Tomalak
Jayani Sumudini

12
ORDER BY article_rating ASC , article_time DESC

DESCna końcu posortuje według obu kolumn malejąco. Musisz określić, ASCczy chcesz inaczej


8

Może to pomóc komuś, kto szuka sposobu sortowania tabeli według dwóch kolumn, ale równolegle. Oznacza to połączenie dwóch rodzajów za pomocą funkcji sortowania agregującego. Jest to bardzo przydatne, na przykład podczas wyszukiwania artykułów przy użyciu wyszukiwania pełnotekstowego, a także w odniesieniu do daty publikacji artykułu.

To tylko przykład, ale jeśli wpadniesz na pomysł, możesz znaleźć wiele funkcji agregujących do użycia. Możesz nawet zważyć kolumny, aby preferować jedną zamiast drugiej. Moja funkcja przyjmuje skrajności z obu rodzajów, dlatego najbardziej cenione wiersze znajdują się na górze.

Przepraszam, jeśli istnieją prostsze rozwiązania do wykonania tej pracy, ale nie znalazłem żadnej.

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
o mój boże, dlaczego publikujecie taki kod dla tak prostego pytania?
Ben Sinclair

4

Poniższe uporządkuje dane w zależności od obu kolumn w porządku malejącym.

ORDER BY article_rating DESC, article_time DESC

3
W jaki sposób kopia zaakceptowanej odpowiedzi 4 lata później otrzymuje tyle głosów pozytywnych?
Stack Underflow

może wynikać z wyjaśnienia: P
Rizwan Haider
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.