2011-12-16 5 views
5

私はMySQLで多テーブルの関係を持っています:tickets,ticket_solutionsおよびsolutionsの3つのテーブルがあります。ここで、(。チケットは複数のソリューションを有することができ、及び溶液は複数のチケットに適用)NULLが許可されている多対多リレーションシップのための左外部結合の使用

簡略テーブル構造がある:

tickets ticket_solutions solutions 
-----  -----    ----- 
id   ticket_id   id 
      solution_id   solution 

(この例では、すべてのフィールドがVARCHARあるsolutions.solutionを除いINTあります。 )一部のチケットは完了していないため、解決策がない可能性があります。

私は、次のクエリを書いている:

SELECT t.id, GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', ') solutions 
FROM tickets t 
LEFT JOIN ticket_solutions tsol ON (tsol.ticket_id = t.id) 
LEFT JOIN solutions sol ON (tsol.solution_id = sol.id) 
GROUP BY t.id DESC; 

私の質問は、第二LEFT JOINです。指定されたチケットのリンカテーブル(ticket_solutions)にエントリが存在する場合、は常にのレコードとなり、一致するレコードはsolutionsになります。しかし、代わりにINNER JOINを使用しようとすると、私はもはや解決策がないチケットを取得しません。

私の考えでは、NULL値が発生する唯一の時間は、ticketsとリンカテーブルの関係です。 (まだ解決策のないチケットがあります)

この特定の関係にはNULLの値がないのに、リンカーテーブルとsolutionsの間にLEFT JOINを使用する必要がありますか?

そうでない場合、推奨されるクエリ構造は何ですか?

答えて

7

はこのようにそれを試してみてください:あなたはticket_solutionsへのチケットを、参加左あなたのオリジナルのSQLで

SELECT t.id, GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', ') solutions 
    FROM tickets t 
     LEFT JOIN ticket_solutions tsol 
      INNER JOIN solutions sol 
       ON (tsol.solution_id = sol.id) 
      ON (tsol.ticket_id = t.id) 
    GROUP BY t.id DESC; 
+0

これは私が探していたまさにです。ありがとうございました。 – JYelton

1

、その後、対応するソリューションせずに行をSUPRESSますソリューションへの結果の表示をインナーに参加します。また、あなたのソリューションへの最初の内側に参加ticket_solutions

SELECT t.id, GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', ') 
FROM tickets t 
LEFT JOIN 
    (SELECT ticket_solutions.ticket_id AS id, solutions.solution AS solution 
    FROM ticket_solutions tsol 
    INNER JOIN solutions ON ticket_solutions.solution_id=solutions.id 
    ) AS sol ON t.id=sol.id 

のように書くことができジョー・ステファネリの回答では、

は、その後、左の参加チケットに結果の表示を、このように空のチケットをsupressingしません。

0

ジョー・ステファネリの答えはまさに正しいです。 はちょうどあなたが代わりにヌルの空の文字列を持っている

IFNULL(GROUP_CONCAT(DISTINCT sol.solution SEPARATOR ', '), '') 

を使用することができることを追加したいです。同じ問題に関するいくつかの他の議論が混乱しているので、

しかし、全く同じように、このバイオリンをリンクしたい:http://www.sqlfiddle.com/#!2/54c6f/3/0

関連する問題