У меня есть следующая таблица в 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 и published_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)
Спасибо