Как отсортировать таблицу MySQL по двум столбцам?
То, что я хочу, это статьи, отсортированные по самым высоким рейтингам, а затем самая последняя дата. В качестве примера это будет образец вывода (слева # является рейтинг, затем название статьи, затем дата статьи)
50 | Эта статья скалы | 4 февраля 2009 г. 35 | Эта статья довольно хороша | 1 февраля 2009 г. 5 | Эта статья не так жарко | 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