2013-09-30 7 views
2

У меня есть таблица с двумя столбцами «id» и «name». id является регулярным индексом автоинкремента, имя - просто varchar.Сортировка результата mysql. order by col1, group by col2

id name 
1 john 
2 mary 
3 pop 
4 mary 
5 john 
6 michael 
7 john 
8 will 

Я хотел бы сортировать результаты поиска, как это

8 will 
7 john 
5 john 
1 john 
6 michael 
4 mary 
2 mary 
3 pop 

Id являются DESC, но все повторяющиеся имена сгруппированы вместе. Это нормально Если ASC легче достичь. Я могу при необходимости изменить результат на PHP.

Регулярное имя ORDER BY, id DESC сначала сортирует все имена, а затем сортирует идентификаторы. Я этого не хочу. Меня не интересуют алфавитные порядки имен.

Я хочу идентификатор в порядке DESC, сгруппированный по двойным именам, если таковые имеются.

p.s. Прошу прощения, это повторяющийся вопрос.

+0

В вашем идентификаторе результата находятся ** не ** DESC –

+1

В SQL 'ORDER BY' будут сортировать строки результатов, сравнивая их по одному. Поскольку позиция '5 john' в вашем желаемом результате зависит от положения' 7 john', это не сработает. Я боюсь, что нет реляционной конструкции, которая выполнит ваше требование. –

+0

@Alma Do Mundo: Вы правы. Id не буквально в порядке DECS. Но есть один глобальный заказ DECS (8,7,6,4,3) и одна группа местных заказов DECS (7,5,1) (4,2) – CoR

ответ

3

Если вы правильно поняли, для этого вам понадобится временная таблица.

SELECT TableName.id, TableName.Name FROM TableName 
INNER JOIN 
(
    SELECT Name, max(id) as maxid FROM TableName GROUP BY Name 
) as tmp on tmp.Name = TableName.Name 
ORDER BY maxid DESC, id DESC 
+0

Я ставлю предложение WHERE между INNER JOIN и ORDER BY. Это работает :) Спасибо. – CoR

0

В MySQL есть группа по статье, см select и поиск группы по на странице.

Есть примеры на странице

так попробовать это ...

SELECT id, name FROM TableName 
group BY name; 

Как ваш ID выступает в качестве первичного ключа вы, вероятно, не нужно, чтобы сказать ему, чтобы отсортировать по возрастанию, но вы можете добавить

order by id 

если хотите.

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

Хотя, что указанный просто используя

order by desc(name) 

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

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