#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;