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

我正在尝试连接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.

SQL Fiddle Demo

1:不要与使用INNER JOIN而不是JOIN混淆,它们与默认JOIN是内部联接是相同的,我只是出于可读性考虑.另外,与OUTER关键字相同,我在LEFT JOIN中省略了它,因为在使用LEFT或RIGHT时它是可选的

2:您会在参考页中找到MySQL中JOIN语法的其他变体,例如没有连接条件的JOIN表名,以及其他.您可能需要阅读它们.

上一篇:mysql-无脂肪框架sql清理


下一篇:在python中包装行:断开参数字符串