【问题标题】:mySQL Nesting of joins N-1 and N-N连接 N-1 和 N-N 的 mySQL 嵌套
【发布时间】:2012-12-29 04:16:24
【问题描述】:

我正在尝试加入 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

有人知道吗?

感谢您的回答。

【问题讨论】:

    标签: mysql join syntax left-join


    【解决方案1】:

    改用这个语法:

    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 语法。有关更多信息,请参阅:

    您发布的查询不起作用,因为它不是 MySQL 中 JOIN 的正确语法,您有三个 ON 子句一个接一个:

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

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

    SQL Fiddle Demo


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

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

    【讨论】:

    • 啊,好吧,这很有帮助。你刚刚让我知道了“新”的 SQL 语法。我的大部分应用程序(和我自己)都在旧应用程序中......但这很有意义。感谢您的努力和有用的链接!
    • 好的,但我还有另一个问题。我正在调查这个,但确实有另一个问题。如果你有一个包含三个 FK 的 N-N 表怎么办。
    • @user1976489 您能否解释一下该表与具有这三个 FK 的其他表的关系?这是可能的,您可以使用不同的别名多次JOIN 此表,也可以在相同的ON 上指定多个条件作为JOIN 条件。随意编辑您的问题,用表格结构和您正在尝试做什么来解释这一点,以便我可以清楚地理解它以及其他用户也可以提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多