3

2 つの 1-N テーブルと 1 つの NN テーブルを介して 4 つのテーブルを結合しようとしています。奇妙なことに、mySql は私の構文の 1 つを気に入らないようです。これが 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;

これは、機能した 2 番目のクエリと同等です。

WHERE t2.id = t1.tableTwo_id2 番目のクエリの は実際にはINNER JOIN1であるため、これは私が行ったのと同じになりますINNER JOIN tableTwo t2 ON t2.id = t1.fk_tableTwo。これは古いJOIN構文です。これを避けて、代わりに ANSI SQL-92 構文を使用してください。詳細については、これを参照してください。

JOINあなたが投稿したクエリは、MySQLの正しい構文ではないため、機能しませんでしたON。お互いの後に 3 つの句があります。

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

それぞれに、直接の後の句でJOIN指定された結合条件が必要です。そうでない場合は、クロス結合2になります。しかし、あなたがしたように複数ではありません。ONJOINON

SQL フィドルのデモ


1:代わりにの使用と混同しないでください。デフォルトは内部結合と同じです。読みやすくするために使用しただけです。また、キーワードと同じことですが、 orを使用する場合はオプションなので省略します。INNER JOINJOINJOINOUTERLEFT JOINLEFTRIGHT

2: MySQLの構文のその他のバリエーションは、参照ページに記載されています。たとえば、結合条件なしなどです。それらを読む必要があるかもしれません。JOINJOIN tablename

于 2013-01-15T05:01:23.897 に答える