MySQL涉及疯狂的多个自连接

时间:2010-09-01 15:08:39

标签: mysql left-join join inner-join self-join

作为替换使用速度非常慢的嵌套选择的旧代码的过程的一部分,我最终得到了一个如下所示的查询:

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(复制r1)中与table_d的记录子集有关系的记录。

在下一次加入时,我正在查找主要索引(table_r)与父索引({{1}匹配的r2r_id)的第二个副本中的记录来自前一次加入的记录。

然后我尝试使用parent_id LEFT JOINtable_r)的第三个副本r3,只需将r_idr_id匹配以前的加入。这个最外层连接的想法是从table_r获取所有记录,但是通过使用另一个条件(尚未在我的查询中)来确定相应的NOT IN选择来确定哪些记录在r3 NULLs r2_id。{/ 1}

问题在于LEFT JOIN没有给我全部table_r。它给了我相同的记录子集,而没有最终的连接 - 换句话说,就像INNER JOIN一样。因此,虽然我期待1208条记录,但我得到508条。

我知道我必须在这里做些事......

1 个答案:

答案 0 :(得分:0)

如果您尝试这种情况会发生什么?

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 AND d.d_id = 3
 ) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id

我所做的是将d.d_id = 3从where子句移动到INNER JOINs ON限定符。