我正在尝试连接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
有人知道吗?
谢谢回答.
解决方法:
请改用以下语法:
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 JOIN1,它将和INNER JOIN tableTwo一样,就像我所做的那样.t2 ON t2.id = t1.fk_tableTwo.这是旧的JOIN语法,请尽量避免使用它,而应像我一样使用ANSI SQL-92语法.有关更多信息,请参见:
> Bad habits to kick : using old-style JOINs.
您发布的查询不起作用,因为它不是MySQL中JOIN
的正确语法,彼此之间有三个ON子句:
...
ON t4.id = t3.fk_tableFour
ON t2.id = t3.fk_tableTwo
ON t2.id = t1.fk_tableTwo
每个JOIN都应具有直接在JOIN之后的ON子句指定的连接条件,如果不是,则为交叉join2.但是您执行的方式并不是多次ON.
1:不要与使用INNER JOIN而不是JOIN混淆,它们与默认JOIN是内部联接是相同的,我只是出于可读性考虑.另外,与OUTER关键字相同,我在LEFT JOIN中省略了它,因为在使用LEFT或RIGHT时它是可选的
2:您会在参考页中找到MySQL中JOIN语法的其他变体,例如没有连接条件的JOIN表名,以及其他.您可能需要阅读它们.