Хитрый SELECT. Прошу совета

ijk
На сайте с 19.08.2007
Offline
199
ijk
788

Есть таблица постов с трёмя полями:

* id

* rating

* type

Если я хочу выбрать 5 ТОПовых постов, то я пишу:

SELECT * FROM posts ORDER by rating DESC LIMIT 0,5

А как выбрать 5 ТОПов постов, чтобы у всех были уникальные типы? Поясню:

ID       rating        type

1 100 1
2 99 2
3 98 3
4 97 4
5 96 1
6 95 5

Мне надо сделать так, чтобы выбирались: 1, 2, 3, 4, 6. id = 5 не выбирается, т.к. это уже дубликат по type с id = 1.

rammlied
На сайте с 13.04.2011
Offline
56
#1

Select DISTINCT(type),id,rating from posts ORDER BY rating DESC LIMIT 0,5

попробуйте так

делаю СДЛы, получаются ГСы )
ijk
На сайте с 19.08.2007
Offline
199
ijk
#2
rammlied:
Select DISTINCT(type),id,rating from posts ORDER BY rating DESC LIMIT 0,5
попробуйте так

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

T
На сайте с 20.03.2007
Offline
67
Toy
#3

SELECT MAX(id) AS id, type FROM posts GROUP BY type ORDER BY id DESC LIMIT 10

Попробуйте так, если не сработает, напишите какая ошибка возвращается.

В PostgreSQL точно должно работать, использую в одном из своих проектов подобное.

ijk
На сайте с 19.08.2007
Offline
199
ijk
#4
Toy:
SELECT MAX(id) AS id, type FROM posts GROUP BY type ORDER BY id DESC LIMIT 10

Попробуйте так, если не сработает, напишите какая ошибка возвращается.
В PostgreSQL точно должно работать, использую в одном из своих проектов подобное.

Это не может быть правдой, т.к. rating в этом запросе вообще не задействован!

T
На сайте с 20.03.2007
Offline
67
Toy
#5

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

Задействуйте, в чем проблема?

SELECT MAX(id) AS id, type, rating FROM posts GROUP BY type ORDER BY rating DESC LIMIT 5
ijk
На сайте с 19.08.2007
Offline
199
ijk
#6
Toy:
ijk, вы бы хоть немного сами подумали...
Задействуйте, в чем проблема?
SELECT MAX(id) AS id, type, rating FROM posts GROUP BY type ORDER BY rating DESC LIMIT 5

Toy, спасибо! Всё работает.

Только вот реальная ситуация сложнее, поэтому всё не работает опять. Структура немного сложнее...

Есть таблица posts:

* id

* type

Есть таблица rates:

* id

* rating

между ними соответствие 1 <-> 1

Вот такой запрос:

SELECT MAX(posts.id) AS id, type, rating FROM posts, rates WHERE posts.id = rates.id GROUP BY type ORDER BY rating DESC LIMIT 5

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

T
На сайте с 20.03.2007
Offline
67
Toy
#7

Я бы сделал вложенный запрос, но предупреждаю что я салага в sql, и возможно тут правильней использовать JOIN или еще что-то.

SELECT MAX(id) AS id, type, (SELECT rating FROM rates WHERE id = posts.id) AS rating FROM posts GROUP BY type ORDER BY rating DESC LIMIT 5
ijk
На сайте с 19.08.2007
Offline
199
ijk
#8
Toy:
Я бы сделал вложенный запрос, но предупреждаю что я салага в sql, и возможно тут правильней использовать JOIN или еще что-то.
SELECT MAX(id) AS id, type, (SELECT rating FROM rates WHERE id = posts.id) AS rating FROM posts GROUP BY type ORDER BY rating DESC LIMIT 5

Через временные таблицы удалось провернуть всё, но скорость работы упала в 100 раз((

ijk добавил 22.09.2011 в 18:30

Победа! Не факт, что оптимально, но приемлемо. Запрос:

SELECT MIN(posts.id), posts.type, rates.rating FROM posts, rates JOIN (SELECT MAX(rates.rating) as MaxR, type FROM posts, rates WHERE posts.id = rates.id GROUP BY type ORDER BY MaxR DESC LIMIT 5) as y ON rates.rating = y.MaxR

WHERE posts.id = rates.id

GROUP by type

ORDER by rates.rating DESC

LIMIT 5

Суть такова:

1. Считаем макс. рейтинг по каждому типу и выбираем пять различных типов с максимальными рейтингами (внутри JOIN).

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

3. На всякий случай делаем LIMIT 5 в конце, если есть много разных статей с равными макс. рейтингами.

Вроде должно работать верно. Спасибо всем за обсуждение и вклад в решение проблемы!

V
На сайте с 03.12.2007
Offline
94
#9

SELECT MAX(posts.id) AS id, type, rating FROM posts INNER JOIN rates USING(id) GROUP BY type ORDER BY rating DESC LIMIT 5

ijk
На сайте с 19.08.2007
Offline
199
ijk
#10
vavenko:
SELECT MAX(posts.id) AS id, type, rating FROM posts INNER JOIN rates USING(id) GROUP BY type ORDER BY rating DESC LIMIT 5

Увы, так не работает(( Думаю потому, что сначала идёт группировка, а потом уже упорядочивание по рейтингу.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий