У меня есть следующая таблица на MySQL 5.1.30:
CREATE TABLE article (
article_id int(10) unsigned NOT NULL AUTO_INCREMENT,
category_id int(10) unsigned NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (article_id)
);
С этой информацией:
1, 1, 'foo'
2, 1, 'bar'
3, 1, 'baz'
4, 1, 'quox'
5, 2, 'quonom'
6, 2, 'qox'
Мне нужно получить первые три статьи в каждой категории для всех категорий, в которых есть статьи. Примерно так:
1, 1, 'foo'
2, 1, 'bar'
3, 1, 'baz'
5, 2, 'quonom'
6, 2, 'qox'
Конечно, союз будет работать:
select * from articles where category_id = 1 limit 3
union
select * from articles where category_id = 2 limit 3
Но в базе данных есть неизвестное количество категорий. Кроме того, порядок должен быть указан столбцами is_sticky и publ_date, которые я упустил из примеров для упрощения.
Можно ли создать запрос, который извлекает эту информацию?
ОБНОВЛЕНИЕ: Я попробовал следующее, что, казалось бы, сработало за исключением , что MySQL не поддерживает предложение limit внутри подвыбора. Вы знаете способ симуляции лимита там?
select *
from articles a
where a.article_id in (select f.article_id
from articles f
where f.category_id = a.category_id
order by f.is_sticky, f.published_at
limit 3)
Спасибо