Заказать таблицу MySQL по двум столбцам

228

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

То, что я хочу, это статьи, отсортированные по наивысшим рейтингам, а затем по самой последней дате. В качестве примера, это будет пример вывода (слева # рейтинг, затем название статьи, затем дата статьи)

50 | Эта статья качается | 4 февраля 2009 г.
35 | Эта статья довольно хорошая | 1 февраля 2009 г.
5 | Эта статья не так жарко | 25 января 2009 г.

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

ORDER BY article_rating, article_time DESC

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

billynoah
источник

Ответы:

480

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

ORDER BY article_rating DESC, article_time DESC
truppo
источник
Странный. Когда у меня есть два столбца, имя и общее количество, и я хочу упорядочить в алфавитном порядке по имени и DESC по общему количеству, тогда я вижу только, что оно было упорядочено по имени, но не по общему количеству
Евгений
Я взломал (-1) * field1, field2 без причины для числовых полей ... спасибо.
Асад Хасан
хахаха .... не хороший запрос, потому что если вы попробуете, то никогда не сможете изменить порядок категорий "пустых" значений ... хорошая попытка в 2009 году .. но в 2015 году не работает должным образом;), правильное значение "3 подзапрос "или" 2 "
доставлено
Такой запрос не работает в моем случае. В этом случае я не получаю сортировку по Городу, выберите отдельный Город, Страна по заказу клиентов по Странам, Городам;
Pra_A
4
Я не знаю, почему это проверено как ответ, но это не так. Сортирует по первому столбцу, затем по второму, но не по обоим одновременно.
aidonsnous
34
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.
Томалак
источник
Этот ответ помог мне. Спасибо @Tomalak
Джаяни Сумудини
12
ORDER BY article_rating ASC , article_time DESC

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

Обучение
источник
8

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

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

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

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
Боже мой, почему вы публикуете такой код для такого простого вопроса.
Бен Синклер
4

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

ORDER BY article_rating DESC, article_time DESC
Иван
источник
3
Как копия принятого ответа через 4 года получает столько голосов?
Stack
может быть из-за объяснения: P
Ризван Хайдер