SQL ограничивает количество возвращаемых строк для каждого указанного значения столбца в одном запросе

#mysql #sql

#mysql #sql

Вопрос:

Версия MySQL 5.7

ТАБЛИЦА: имя, идентификатор категории.

Можно ли выбрать только указанное количество строк из каждого CategoryID?

Что-то вроде этого:

ВЫБЕРИТЕ * ИЗ таблицы1

Псевдо: ОГРАНИЧЕНИЕ 10, ГДЕ CategoryID = 5 ОГРАНИЧЕНИЕ 50, ГДЕ CategoryID = 8

Ответ №1:

Если вы используете версию MySQL, которая не поддерживает оконные функции, вы можете сделать это с помощью соответствующего подзапроса в WHERE предложении:

 SELECT t.* FROM tablename t
WHERE t.categoryID IN (5, 8)
AND (SELECT COUNT(*) FROM tablename WHERE categoryID = t.categoryID AND name < t.name) < 
    CASE t.categoryID
      WHEN 5 THEN 10
      WHEN 8 THEN 50
    END
  

Если вам нужны результаты для всех categoryID s, вы можете удалить условие t.categoryID IN (5, 8) из WHERE предложения и перечислить все categoryID s в CASE выражении:

 SELECT t.* FROM tablename t
WHERE (SELECT COUNT(*) FROM tablename WHERE categoryID = t.categoryID AND name < t.name) < 
    CASE t.categoryID
      WHEN 5 THEN 10
      WHEN 8 THEN 50
      WHEN .....
    END
  

Смотрите упрощенную демонстрацию.

Обратите внимание, что я предполагаю, что столбец name является первичным ключом или уникальным в таблице.
Если это не так, то вам следует использовать первичный ключ таблицы в приведенных выше запросах вместо name .

Ответ №2:

Используйте row_number() :

 select t.*
from (select t.*,
             row_number() over (partition by categoryid order by categoryid) as seqnum 
      from t
     ) t
where seqnum <= 5;