为简单起见,我将留下与问题无关的字段。
我的表结构是,
消息
news_id | parent_category | child_category
类别
category_id | maincategory_name
子类别
subcategory_id | subcategory_name
正如已经很明显的,category_id
被链接到parent_id
和subcategory_id
被链接到child_category
表news
。
我现在拥有的
SELECT *
FROM (
SELECT news . * , @rn :=
CASE WHEN @child_category = child_category
THEN @rn +1
ELSE 1
END AS rn, @child_category := child_category
FROM news, (
SELECT @rn :=0, @child_category := NULL
) AS vars
ORDER BY child_category
) AS T1
LEFT JOIN category ON parent_category = category.category_id
LEFT JOIN subcategory ON child_category =
subcategory.subcategory_id
WHERE rn <=12 AND parent_category = (SELECT category_id FROM
category WHERE maincategory_name='ukraine') AND
child_category!= (SELECT `subcategory_id` FROM subcategory
WHERE `subcategory_name` = 'kiev')
ORDER BY category.category_id DESC
上面的 sql 工作并从每个类别中获取 12 行。
问题
我现在面临的问题是,查询从每个类别中获取数据。我想将此类别数限制为 2 或 3。例如,如果subcategory
表中有 8 个子类别,它将从所有子类别中获取数据。我想将获取限制在一个限制,比如 3(任何 3 个类别)。
我尝试使用如下IN
语句,
SELECT *
FROM (
SELECT news . * , @rn :=
CASE WHEN @child_category = child_category
THEN @rn +1
ELSE 1
END AS rn, @child_category := child_category
FROM news, (
SELECT @rn :=0, @child_category := NULL
) AS vars
ORDER BY child_category
) AS T1
LEFT JOIN category ON parent_category = category.category_id
LEFT JOIN subcategory ON child_category =
subcategory.subcategory_id
WHERE rn <=12 AND parent_category = (SELECT category_id FROM
category WHERE maincategory_name='ukraine') AND
child_category IN (2,4)
ORDER BY category.category_id DESC
IN range
将由子查询检索的位置。在逻辑上,如果我将该子查询限制为 3 个结果,我的工作就完成了。但事实证明,IN
语句不支持LIMIT
子查询中的子句。
所以问题是,从有限数量的类别中检索数据(已修复但我已经弄清楚)的解决方法是什么。
相同的数据
新闻表
| news_id | parent_category | child_category
| 1 | 1 | 1
| 2 | 1 | 2
类别表
| category_id | maincategory_name
| 1 | Ukraine
| 2 | Russia
| 3 | Belarus
子类别表
| subcategory_id | subcategory_name
| 1 | Kiev
| 2 | Odessa
| 3 | Moscow
| 4 | Simferopol
| 5 | Dnipropetrovsk
结果应该是这样的......
假设 Kiev、Odessa、simferopol 和 Dnipropetrovsk 进入主类别 1 即乌克兰,我想要 2 个类别不包括 Kiev(即结果应包含simferopol和Dnipro或Odessa和Dnipro或Odessa和simferopol)
问题是,查询将获取所有 3 个类别(或更多,如果可用),而我只需要 2 个(或有时 3 个)。
更多信息
sql小提琴
create table News(news_id int, parent_category int, child_category int);
insert into News values (1,1,1), (2,1,2), (3,1,2), (4,1,4),(5,1,4), (6,1,5), (7,2,3), (8,1,5), (9,1,2);
create table Category(category_id int, maincategory_name varchar(100));
insert into Category values (1, 'Ukraine'), (2, 'Russia'), (3, 'Belarus');
create table Subcategory (subcategory_id int, subcategory_name varchar(100));
insert into Subcategory values (1, 'Kiev'), (2, 'Odessa'), (3, 'Moscow'), (4, 'Simferopol'), (5, 'Dinipro');
样本数据
目标
从上面的结果我想实现以下目标:
仅从一个主要类别(即此处的乌克兰并删除俄罗斯)中获取结果,但可以轻松完成,因此无需担心。
仅获取 2 个子类别(上面的集合包含 3 个子类别。敖德萨、辛菲罗波尔和第聂伯罗。我只想要其中的任何两个)。我可以对其进行硬编码以检索它,但我也会在其他地方使用相同的查询,因此硬编码会破坏该目的。
从上面提取的上述 2 个子类别中的每个子类别中,应从每个子类别中获得最多 5 行。(我在我的问题的第一个查询中实现了这一点)。
从以上2个要求,我没有达到。1和没有。3. 我被卡住的地方是 2 号。从结果集中,我无法获取仅包含 2 个子类别的结果。结果集输出包含所有可用类别的数据。(这里只有 3 个子类别,因此结果包含所有 3 个。如果有 10 个子类别,它将检索所有 10 个子类别数据)。我希望现在更清楚一点。