mySQL嵌套连接N-1和N-N

时间:2013-01-15 04:55:55

标签: mysql join syntax left-join

我正在尝试加入4个表,两个1-N表和一个通过N-N表。奇怪的是mySql似乎不喜欢我的一种语法。有人知道这是由于myOwn限制还是mySql?

这不起作用:

SELECT *
FROM tableOne t1 JOIN tableTwo t2 
    LEFT OUTER JOIN N_N_tableThree t3 
            JOIN tableFour t4 ON t4.id = t3.fk_tableFour
        ON t2.id = t3.fk_tableTwo
    ON t2.id = t1.fk_tableTwo

虽然这确实有效

SELECT *
FROM tableOne t1,
tableTwo t2 LEFT OUTER JOIN N_N_tableThree t3 
        JOIN tableFour t4 ON t4.id = t3.tableFour_id
    ON t2.id = t3.tableTwo_id
WHERE t2.id = t1.tableTwo_id

有人知道吗?

感谢您的回答。

1 个答案:

答案 0 :(得分:4)

请改用此语法:

SELECT *
FROM tableOne            t1 
INNER JOIN tableTwo      t2 ON t2.id = t1.fk_tableTwo
LEFT JOIN N_N_tableThree t3 ON t2.id = t3.fk_tableTwo
INNER JOIN tableFour     t4 ON t4.id = t3.fk_tableFour;

这相当于第二个有效的查询。

因为第二个查询中的WHERE t2.id = t1.tableTwo_id实际上是INNER JOIN 1 ,所以与INNER JOIN tableTwo t2 ON t2.id = t1.fk_tableTwo相同我做到了。这是旧的JOIN语法,尽量避免使用它,并像我一样使用ANSI SQL-92语法。有关更多信息,请参阅:

您发布的查询无效,因为它不是MySQL中JOIN的正确语法,您之后有三个ON子句:

...
ON t4.id = t3.fk_tableFour
ON t2.id = t3.fk_tableTwo
ON t2.id = t1.fk_tableTwo

每个JOIN都应该直接在ON之后使用JOIN子句指定连接条件,否则就会交叉加入 2 。但是你的方式不是多个ON

SQL Fiddle Demo


1: 不要与使用INNER JOIN代替JOIN混淆,它们与默认JOIN相同是内连接,我只是用于可读性。此外,OUTER关键字也是如此,我在LEFT JOIN中省略了它,因为在使用LEFTRIGHT 时,它是可选的

2: 您可以在参考页面中找到MySQL中JOIN语法的其他变体,例如没有连接条件的JOIN tablename,和别的。您可能需要阅读它们。功能