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

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

To, czego chcę, to artykuły posortowane najpierw według najwyższych ocen, a następnie ostatniej daty. Jako przykład, będzie to Przykładowe wyjście (Lewy # to ocena, następnie tytuł artykułu, a następnie Data artykułu)

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

Odpowiedni SQL, którego używam to:

ORDER BY article_rating, article_time DESC
Mogę sortować po jednym lub drugim, ale nie po obu.
Author: billynoah, 2009-02-05

5 answers

Domyślne sortowanie jest rosnąco, musisz dodać słowo kluczowe DESC do obu zamówień:

ORDER BY article_rating DESC, article_time DESC
 516
Author: truppo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 07:51:35
ORDER BY article_rating, article_time DESC

Będzie sortować 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 rozważ:

↓ 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.
 37
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-05 07:55:05
ORDER BY article_rating ASC , article_time DESC

DESC na końcu posortuje po obu kolumnach malejących. Musisz podać ASC jeśli chcesz to inaczej

 14
Author: Learning,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-21 10:19:24

To może pomóc komuś, kto szuka sposobu sortowania tabeli po dwóch kolumnach, ale w paralelowy sposób. Oznacza to połączenie dwóch sortów za pomocą funkcji sortowania zbiorczego. Jest to bardzo przydatne na przykład podczas pobierania artykułów za pomocą wyszukiwania pełnotekstowego, a także w przypadku daty publikacji artykułu.

To tylko przykład, ale jeśli złapiesz pomysł, możesz znaleźć wiele zagregowanych funkcji do użycia. Możesz nawet ważyć kolumny, aby preferować jedną nad drugą. Moja funkcja zajmuje skrajności z obu rodzajów, a więc najbardziej cenione wiersze znajdują się na górze.

Sorry jeśli istnieją prostsze rozwiązania do tej pracy, ale nie znalazłem żadnych.

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
 8
Author: Jiri Fornous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-20 09:19:12

Poniżej zostaną uporządkowane dane w zależności od obu kolumn w porządku malejącym.

ORDER BY article_rating DESC, article_time DESC
 3
Author: Ivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-14 19:21:35