MySQL - "select" 查询内部 IN (...) 优化问题(=> 分层查询)
MySQL - "select" query inside IN (...) optimization issue (=> Hierarquical query )
在你开始投票并拒绝我回答之前,请注意我是一个完全的初学者:)。我已经搜索了答案,但它似乎非常具体。
(我作为程序员的理解方式,如果 select 语句中的 for 循环,它就像一个循环中的循环中的循环:D)
问题是关于优化我的 sql 查询,因为获取数据需要几秒钟。
SQL细分:
1st.查询
SELECT *
FROM r_submenuitems
WHERE modifier1 IN (SELECT submenu_id FROM r_submenuitems WHERE item_id = 1068)
这个查询得到一个列表(准确地说是第二个查询中的列表),我想更上一层楼。 IE。再次在查询的 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 个查询比有一个查询更好??
edit: 第一个查询returns条目列表(31050、131050、3912、103122、103165、7772、7782)。然后我继续输入第二个查询。多合一查询试图将这两个合并为一个,即更深入
检查已批准答案的评论,原来我要找的是分层查询。
尝试
SELECT submenu_id
FROM r_submenuitems r1
INNER JOIN r_submenuitems r2
ON r1.modifier1 = r2.submenu_id
WHERE r2.item_id = 1068
您的查询正在提取您的 table 三次,这就是它花费这么长时间的原因。其中一个是完全没有必要的,你只是在重复代码。
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
正如您在寻找 分层查询 的评论中所讨论的那样,由于 mysql 不支持对本机命令的此类操作,您至少必须知道你想要创建查询以从该级别获取数据的深度,你会看到它需要为每个级别添加一个 JOIN
操作。
另一种方法是创建一个带有递归的存储过程(我不会解释这个)看看这里 MANAGING HIERARCHICAL DATA IN 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
在你开始投票并拒绝我回答之前,请注意我是一个完全的初学者:)。我已经搜索了答案,但它似乎非常具体。
(我作为程序员的理解方式,如果 select 语句中的 for 循环,它就像一个循环中的循环中的循环:D)
问题是关于优化我的 sql 查询,因为获取数据需要几秒钟。
SQL细分:
1st.查询
SELECT *
FROM r_submenuitems
WHERE modifier1 IN (SELECT submenu_id FROM r_submenuitems WHERE item_id = 1068)
这个查询得到一个列表(准确地说是第二个查询中的列表),我想更上一层楼。 IE。再次在查询的 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 个查询比有一个查询更好??
edit: 第一个查询returns条目列表(31050、131050、3912、103122、103165、7772、7782)。然后我继续输入第二个查询。多合一查询试图将这两个合并为一个,即更深入 检查已批准答案的评论,原来我要找的是分层查询。
尝试
SELECT submenu_id
FROM r_submenuitems r1
INNER JOIN r_submenuitems r2
ON r1.modifier1 = r2.submenu_id
WHERE r2.item_id = 1068
您的查询正在提取您的 table 三次,这就是它花费这么长时间的原因。其中一个是完全没有必要的,你只是在重复代码。
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
正如您在寻找 分层查询 的评论中所讨论的那样,由于 mysql 不支持对本机命令的此类操作,您至少必须知道你想要创建查询以从该级别获取数据的深度,你会看到它需要为每个级别添加一个 JOIN
操作。
另一种方法是创建一个带有递归的存储过程(我不会解释这个)看看这里 MANAGING HIERARCHICAL DATA IN 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