Ответ 1
Сортировка по умолчанию возрастает, вам нужно добавить ключевое слово DESC к обоим заказам:
ORDER BY article_rating DESC, article_time DESC
Как отсортировать таблицу 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
Я могу сортировать один или другой, но не оба.
Сортировка по умолчанию возрастает, вам нужно добавить ключевое слово DESC к обоим заказам:
ORDER BY article_rating DESC, article_time DESC
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.
ORDER BY article_rating ASC , article_time DESC
DESC
в конце будет сортироваться по обоим столбцам. Вы должны указать ASC
, если хотите это иначе
Это может помочь кому-то, кто ищет способ сортировать таблицу по двум столбцам, но парализованно. Это означает объединение двух видов с использованием функции сортировки агрегатов. Это очень полезно, например, для поиска статей с использованием полнотекстового поиска, а также относительно даты публикации статьи.
Это только пример, но если вы поймете эту идею, вы сможете найти множество совокупных функций для использования. Вы можете даже весовать столбцы, чтобы предпочесть один за секунду. Функция моей принимает крайности из обоих сортов, поэтому наиболее ценные строки находятся сверху.
Извините, если есть более простые решения для выполнения этой задачи, но я не нашел их.
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
Ниже перечислены ваши данные в зависимости от обоих столбцов в порядке убывания.
ORDER BY article_rating DESC, article_time DESC