-2

为简单起见,我将留下与问题无关的字段。

我的表结构是,

消息

news_id | parent_category | child_category

类别

category_id | maincategory_name

子类别

subcategory_id | subcategory_name

正如已经很明显的,category_id被链接到parent_idsubcategory_id被链接到child_categorynews


我现在拥有的

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(即结果应包含simferopolDniproOdessaDniproOdessasimferopol

问题是,查询将获取所有 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 个子类别数据)。我希望现在更清楚一点。

4

1 回答 1

0

恐怕我还没有得到你想要的。你为什么不简单地使用 a 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 行”的数据。您的示例数据仍然没有反映这一点。这就是为什么我不确定,如果这是你要求的。

于 2012-09-24T13:56:13.537 回答