为简单起见,我将离开与问题无关的字段。限制固定数量类别的固定行数
我的表结构,
新闻
news_id | parent_category | child_category
类别
category_id | maincategory_name
子类别
subcategory_id | subcategory_name
因为它已经很明显,category_id
链接到parent_id
和subcategory_id
链接到news
表child_category
。
我有什么权利现在
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
子句。
所以问题是,什么是检索数据(固定,但我已经想通了)从有限数量的类别解决方法。
sameple数据
新闻表
| 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
结果应该是这样的.....
假设基辅,敖德萨,辛菲罗波尔和Dnipropetrovsk的进入maincategory 1即乌克兰,我想2个大类不含基辅(即结果应包含辛菲罗波尔和第聂伯河或敖德萨和第聂伯河或敖德萨和辛菲罗波尔)
问题是,查询将获取所有3个类别(或更多如果可用),其中作为我只想2(或3在t输入法)。
进一步INFO
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');
样本数据
GOAL
从上面的结果,我想实现如下:
取导致只能从一个主种类(即乌克兰在这里,并删除俄罗斯),但它可以很容易地完成,所以没有那个部分的担心。
只抓取2个子类别(上面的设置包含3个子类别,敖德萨,辛菲罗波尔和第聂伯罗,我只需要其中的任何两个)。我可以硬编码它来检索它,但我会在其他地方使用这个相同的查询,所以硬编码将失败的目的。
从上面提到的上述两个子类别中,每个子类别应该获得最多5行。 (我已经在我的问题的第一个查询中实现了这一点)。
从上述2的要求,我没有达到。 1和不。 3.我卡在哪里的是2号。 从结果集中,我无法获取仅包含2个子类别的结果。 和结果集输出数据包含所有可用的类别。 (在这里,只有3个子类别,所以结果包含全部3个。如果将有10个子卡,它将检索所有10个子卡数据)。我现在希望现在更清楚一点。
你能提供样本数据吗? – fancyPants
@tombom样本数据已添加。 – itachi
@tombom更多信息已添加。 – itachi