GROUP BY & ORDER BY - Заказ по определенному полю - PullRequest
1 голос
/ 14 декабря 2010

Мне нужно написать запрос, который возвращает список уникальных «классов», упорядоченных по самому популярному элементу в этом классе.Вот пример запроса:

SELECT items.title, items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY MAX(items.popularity) DESC

Этот запрос возвращает правильный класс, но элемент, который он возвращает, является первым, который появляется в таблице, а не самым популярным.

Аналогичным образом я пробовал:

SELECT MAX(items.title), items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY MAX(items.popularity) DESC

И все варианты - это просто возвращает самые последние добавленные и не самые популярные.

Я прочитал лоты и лоты других ответов.

Я уверен, что есть простой ответ, пожалуйста, помогите!

Ответы [ 4 ]

2 голосов
/ 14 декабря 2010

Вы ничего не выбираете из классов, поэтому вам не нужна эта таблица:

select i.*
from (
    SELECT class_id, max(popularity) as MaxPopularity
    FROM items 
    GROUP BY class_id  
) ip
inner join items i on ip.class_id = i.class_id 
    and ip.MaxPopularity = i.popularity

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

0 голосов
/ 14 декабря 2010

Я не пробовал, но думаю, что это должно работать ...

SELECT MAX(items.title), items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
GROUP BY class_id 
ORDER BY items.popularity DESC
0 голосов
/ 14 декабря 2010
SELECT items.title, items.popularity 
FROM items, classes 
WHERE class_id = classes.id 
ORDER BY items.popularity DESC

Вам не нужна группа by, поскольку вы уже выбираете определенный класс в операторе where.Кроме того, DESC в заказе должен заботиться о заказе без необходимости MAX.

0 голосов
/ 14 декабря 2010

Полагаю, вам следует упорядочить МАКС (популярность) в порядке убывания, попробуйте добавить DESC в конце запроса.

...