3

我正在尝试加入 4 个表,两个 1-N 表和一个通过 NN 表。奇怪的是 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

任何人的线索?

谢谢回答。

4

1 回答 1

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 JOIN1INNER JOIN tableTwo t2 ON t2.id = t1.fk_tableTwo ,这与我所做的相同。这是旧的JOIN语法,尽量避免它并像我一样使用 ANSI SQL-92 语法。有关更多信息,请参阅:

您发布的查询不起作用,因为它不是JOINMySQL 中的正确语法,您ON在彼此之后有三个子句:

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

每个都JOIN应该有直接ON在后面的子句中指定的连接条件JOIN,如果没有,它将是交叉连接2。但不是ON你做的方式 multiple 。

SQL 小提琴演示


1:不要与使用 of而不是混淆,它们是相同的,默认是内部连接,我只是为了可读性而使用。此外,与关键字相同,我将其省略,因为它在使用时是可选的orINNER JOINJOINJOINOUTERLEFT JOINLEFTRIGHT

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

于 2013-01-15T05:01:23.897 回答