У меня есть таблица с элементами внутри:
id title body category_id likes
1 title1 body1 17 57
2 title2 body2 14 35
3 title3 body3 11 16
4 title4 body4 11 96
5 title5 body5 14 78
6 title6 body6 11 64
И я хочу сгруппировать по этой таблице по категориям_ид и заказать понравившиеся:
id title body category_id likes
1 title1 body1 17 57
5 title5 body5 14 78
2 title2 body2 14 35
4 title4 body4 11 96
6 title6 body6 11 64
3 title3 body3 11 16
Я думаю, что должен сделать подзапрос, но как?
Изменение: я использую MySQL DB
Редактировать 2: я забыл упомянуть, что я хотел ограничить результаты 3 строками в категории category_id, потому что хочу отобразить 3 наиболее понравившихся элемента для каждой категории
Фактически, в образце результата вы указали, что не применяется настоящая GROUP BY
. Это просто отсортировано по category_id
и likes
. Чтобы получить ожидаемый результат просто:
SELECT * FROM your_table
ORDER BY category_id DESC, likes DESC
Извините - в MySQL это кажется невозможным - Postgres будет работать. Существуют ограничения: 1. использование недопустимого использования в подзапросе при использовании ключевого слова IN 2. нет ссылки на родительские родительские столбцы в подзапросе
там для следующего ответа не работает.
SELECT *
FROM your_table t1
WHERE t1.id IN (SELECT id
FROM your_table t2
WHERE t1.category_id=t2.category_id
ORDER BY likes DESC
LIMIT 3)
ORDER BY category_id DESC, likes DESC
Я интерпретирую этот вопрос так: я хочу заказать по общим симпатиям для каждой категории.
Вы можете использовать подзапрос в предложении order by
, поэтому один из методов:
select t.*
from t
order by (select sum(t2.likes) from t t2 where t2.category_id = t.category_id),
category_id;
Вы также можете сделать это с помощью оконных функций:
select t.*
from t
order by sum(t.likes) over (partition by t.category_id),
category_id;