Ограничение и группировка по строкам в SQL

0

У меня есть таблица с элементами внутри:

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 наиболее понравившихся элемента для каждой категории

Теги:

3 ответа

1

Фактически, в образце результата вы указали, что не применяется настоящая GROUP BY. Это просто отсортировано по category_id и likes. Чтобы получить ожидаемый результат просто:

SELECT * FROM your_table
ORDER BY category_id DESC, likes DESC
  • 0
    Да, спасибо ! но я забыл упомянуть, что я хочу только 3 результата для каждого category_id ... именно поэтому я хотел смешать группу по (а не по группе) и ограничить
  • 2
    Итак ... вы хотите только 3 лучших результата с большим количеством лайков для каждой категории? Измените исходный вопрос с этими новыми требованиями.
0

Извините - в 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
  • 0
    точно, MySQL не позволяет LIMIT в состояние IN ... но может быть с JOIN?
  • 0
    присоединиться не поможет. необходимо предварительно выбрать идентификаторы с помощью лимита 3. и использование лимита на соединение не даст вам желаемого результата. MySQL сосет
0

Я интерпретирую этот вопрос так: я хочу заказать по общим симпатиям для каждой категории.

Вы можете использовать подзапрос в предложении 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;
  • 0
    этот запрос с оконной функцией будет работать только в MySQL 8.0+, который не готов к использованию.
  • 2
    @RaymondNijland. , , Вопрос не был помечен MySQL, когда я ответил на него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню