Заказать таблицу MySQL по двум столбцам - PullRequest
202 голосов
/ 05 февраля 2009

Как отсортировать таблицу MySQL по двум столбцам?

Мне нужны статьи, отсортированные по наивысшим рейтингам, а затем по самой последней дате. Например, это будет пример выходных данных (слева # рейтинг, затем название статьи, затем дата статьи)

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

Соответствующий SQL, который я использую:

ORDER BY article_rating, article_time DESC

Я могу сортировать по одному или другому, но не по обоим.

Ответы [ 5 ]

428 голосов
/ 05 февраля 2009

По умолчанию сортировка по возрастанию, вам нужно добавить ключевое слово DESC в оба ваших заказа:

ORDER BY article_rating DESC, article_time DESC
29 голосов
/ 05 февраля 2009
ORDER BY article_rating, article_time DESC

будет сортировать по article_time, только если есть две статьи с одинаковым рейтингом. Из всего, что я вижу в вашем примере, именно так и происходит.

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

но учтите:

↓ 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.
11 голосов
/ 05 февраля 2009
ORDER BY article_rating ASC , article_time DESC

DESC в конце сортирует по убыванию обоих столбцов. Вы должны указать ASC, если хотите, иначе

8 голосов
/ 20 апреля 2012

Это может помочь кому-то, кто ищет способ сортировки таблицы по двум столбцам, но параллельно. Это означает объединить две сортировки, используя функцию совокупной сортировки. Это очень полезно, например, для получения статей с использованием полнотекстового поиска, а также для даты публикации статьи.

Это только пример, но если вы поймете эту идею, вы сможете найти множество агрегатных функций для использования. Вы можете даже взвесить столбцы, чтобы они предпочли одну секунду. Моя функция берет крайности от обоих сортов, поэтому наиболее ценные строки находятся сверху.

Извините, если существуют более простые решения для этой работы, но я не нашел ни одного.

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
4 голосов
/ 29 сентября 2013

Следующие данные будут упорядочивать ваши данные в зависимости от обоих столбцов в порядке убывания.

ORDER BY article_rating DESC, article_time DESC
...