Порядок PHP MySQL по двум столбцам

Как отсортировать таблицу 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

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

Ответ 1

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

ORDER BY article_rating DESC, article_time DESC

Ответ 2

ORDER BY article_rating, article_time DESC

будет сортироваться по статье_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.

Ответ 3

ORDER BY article_rating ASC , article_time DESC

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

Ответ 4

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

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

Извините, если есть более простые решения для выполнения этой задачи, но я не нашел их.

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

Ответ 5

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

ORDER BY article_rating DESC, article_time DESC