2012-09-21 25 views
-2

为简单起见,我将离开与问题无关的字段。限制固定数量类别的固定行数

我的表结构,

新闻

news_id | parent_category | child_category

类别

category_id | maincategory_name

子类别

subcategory_id | subcategory_name

因为它已经很明显,category_id链接到parent_idsubcategory_id链接到newschild_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'); 

样本数据

enter image description here

GOAL

从上面的结果,我想实现如下:

  • 取导致只能从一个主种类(即乌克兰在这里,并删除俄罗斯),但它可以很容易地完成,所以没有那个部分的担心。

  • 只抓取2个子类别(上面的设置包含3个子类别,敖德萨,辛菲罗波尔和第聂伯罗,我只需要其中的任何两个)。我可以硬编码它来检索它,但我会在其他地方使用这个相同的查询,所以硬编码将失败的目的。

  • 从上面提到的上述两个子类别中,每个子类别应该获得最多5行。 (我已经在我的问题的第一个查询中实现了这一点)。

从上述2的要求,我没有达到。 1和不。 3.我卡在哪里的是2号。 从结果集中,我无法获取仅包含2个子类别的结果。 和结果集输出数据包含所有可用的类别。 (在这里,只有3个子类别,所以结果包含全部3个。如果将有10个子卡,它将检索所有10个子卡数据)。我现在希望现在更清楚一点。

+0

你能提供样本数据吗? – fancyPants

+0

@tombom样本数据已添加。 – itachi

+0

@tombom更多信息已添加。 – itachi

回答

0

恐怕我可能仍然没有得到你想要的。你为什么不简单地使用GROUP BY

/* SELECT * FROM (*/ 
SELECT 
n.news_id, 
c.maincategory_name, 
sc.subcategory_name 
FROM 
News n 
INNER JOIN Category c ON n.parent_category = c.category_id 
INNER JOIN Subcategory sc ON n.child_category = sc.subcategory_id 
WHERE maincategory_name = 'Ukraine' 
GROUP BY maincategory_name, subcategory_name 
ORDER BY RAND() 
LIMIT 2 
/*)q1 INNER JOIN with_whatever ON q1.news_id = with_whatever.Id */ 

with_whatever拥有你想要得到的数据“最多5行应该从每个子类中获得”。您的示例数据仍然不能反映这一点。这就是为什么我不确定,如果这是你要求的。

+0

我想我无法以清晰的方式解释它。我感谢你的努力。为了让它更简单,你可以在小提琴的问题中运行我的第二个查询吗?这是我想要的确切结果。唯一的问题是,在'IN'语句中,'(2,4)'应该来自子查询(从引用到parentCategory的子类别表),而不是硬编码。但是,我的子查询不但返回2,而且还返回父猫下可用的所有子猫。我无法在“IN”子查询中限制2个结果。 – itachi

+0

@itachi为什么2和4?那是什么标准? – fancyPants

+0

2和4引用子类别表中的子类别标识。标准是选择属于主类别的任何2个子类别。但是每个子类别与主类别表有一对多的关系。因此,每一次都需要指定主类别....我想这种方法有一些麻烦的地方。可能是我需要重新考虑设计...... – itachi