我正在尝试加入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
有人知道吗?
感谢您的回答。
答案 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
。
1: 不要与使用INNER JOIN
代替JOIN
混淆,它们与默认JOIN
相同是内连接,我只是用于可读性。此外,OUTER
关键字也是如此,我在LEFT JOIN
中省略了它,因为在使用LEFT
或RIGHT
时,它是可选的
2: 您可以在参考页面中找到MySQL中JOIN
语法的其他变体,例如没有连接条件的JOIN tablename
,和别的。您可能需要阅读它们。功能