作为替换一些使用非常慢的嵌套选择的旧代码的过程的一部分,我最终得到了一个如下所示的查询:
SELECT r3.r_id AS r3_id, r2.r_id AS r2_id, r1.r_id AS r1_id
FROM
table_r r3
LEFT JOIN (
table_r r2
INNER JOIN (
table_r r1
INNER JOIN table_d d ON r1.r_id = d.r_id
) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id
WHERE d.d_id = 3
所以在最里面的连接中,我正在寻找table_r
(copy r1
) 中的记录,这些记录与table_d
.
在下一次连接中,我在 ( ) 的第二个副本中查找记录,table_r
其r2
主索引 ( ) 与上一次连接中记录r_id
的父索引 ( ) 匹配parent_id
。
然后我尝试使用( )LEFT JOIN
的第三个副本进行 a ,只需与前一个联接的匹配即可。这个最外层连接的想法是从 中获取所有记录,然后通过使用进一步的条件(尚未在我的查询中)来确定中的哪些记录具有选择来执行等效的选择。table_r
r3
r_id
r_id
table_r
NOT IN
r3
NULLs
r2_id
问题是它LEFT JOIN
并没有给我全部table_r
。它给了我在没有最终连接的情况下获得的相同记录子集——换句话说,与INNER JOIN
. 因此,虽然我期待 1208 条记录,但我得到了 508 条记录。
我知道我一定是在做一些古怪的事情……