MySQL-IN(...)优化问题内的“选择”查询(=>层次查询)

哈哈哈

在您开始投票并拒绝回答之前,请注意,我是一个完整的初学者:)。我已经在寻找答案,但这似乎很具体。

(作为程序员,我的理解是,如果select语句在for循环中,那就像是在循环中的循环:D内的循环)

问题是关于优化我的sql查询,因为它需要几秒钟来获取数据。

SQL故障:

1号 询问

SELECT * 
FROM r_submenuitems 
WHERE modifier1 IN (SELECT submenu_id FROM r_submenuitems WHERE item_id = 1068)

此查询获取一个列表(确切地说是第二个查询中的列表),我想再往上走一步。即再次在查询的IN子句中使用此列表,然后获取新列表。

2号 询问

SELECT submenu_id 
FROM r_submenuitems 
WHERE modifier1 IN (31050, 131050,3912, 103122, 103165, 7772, 7782)

要将2个查询合并为1,我做了以下工作:

SELECT submenu_id FROM r_submenuitems 
WHERE modifier1 IN (SELECT submenu_id FROM r_submenuitems 
    WHERE modifier1 IN (SELECT submenu_id FROM r_submenuitems 
        WHERE item_id = 1068))

提取数据需要很长时间。

有没有一种更好的(快速获取)方法来合并以上两个查询呢?如果不是,第一个解决方案是,即拥有2个查询比拥有多合一查询更好吗?

编辑:第一个查询返回条目列表(31050、131050、3912、103122、103165、7722、7782)。然后,我继续将其输入第二个查询。多合一查询尝试将这两个查询合并为一个查询,即更深入地检查已批准答案的注释,原来我正在寻找的称为“层次查询”。

豪尔赫·坎波斯

尝试

SELECT submenu_id  
  FROM r_submenuitems r1
           INNER JOIN r_submenuitems r2
             ON r1.modifier1 = r2.submenu_id
 WHERE r2.item_id = 1068

您的查询正在提取您的表三次,这就是为什么它花费这么长时间的原因。而且其中之一是完全不必要的,您只是在重复代码。

SELECT submenu_id FROM r_submenuitems 
 WHERE modifier1 IN (SELECT submenu_id                   --All this IN statement is
                       FROM r_submenuitems               --unnecessary you are already
                      WHERE modifier1 IN ( SELECT submenu_id -- doing on the inner IN
                                             FROM r_submenuitems 
                                            WHERE item_id = 1068
                                         )
                    )

编辑2

正如评论中所讨论的那样,您正在寻找一个Hierarquical Query,因为mysql不支持对本机命令执行这种操作,因此您至少要知道创建查询以从该级别获取数据的深度,您将看到它需要JOIN为每个级别添加一个操作。

替代方法是创建具有一定递归的存储过程(我将不作解释)在这里查看在MYSQL中管理分层数据

您的问题的查询将是(对于第三级)

SELECT r1.submenu_id  
  FROM r_submenuitems r1 
        INNER JOIN r_submenuitems r2 ON r1.modifier1 = r2.submenu_id
        INNER JOIN r_submenuitems r3 ON r2.modifier1 = r3.submenu_id
 WHERE r3.item_id = 1068

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章