2016-09-13 35 views
0

私はいくつかのテーブルを以下のようなクエリで結合しようとしています。私は理想的にbテーブルが参照するc.nameを取得したいからです。 bテーブルが結果セットに行を持たないか、またはb行がcを参照していない場合は、テーブルが参照するc.nameを取得します。左結合の順序節

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON (b.c_id IS NOT NULL AND b.c_id = c.id) OR a.c_id = c.id 

しかしMySQLは常にa.c_id = c.idとCに入社し、あまり好まれc.nameを得ています。これを回避することは可能ですか、またはできるだけ早く完全な結果セットを取得しようとしていますか?

+0

あなたは、いくつかの(CREATE TABLE文など)テーブル定義、テストデータ(INSERT文として)及び(チェックするのは簡単なものとして)期待される出力を持っています。私は本当にあなたのクエリをテストしたいが、テーブルとテストデータを作成する時間を費やしたくない。 SQL IDEですぐに実行できます。 http://sqlfiddle.comの使用を検討しましたか? –

答えて

0

私はこれが役立つはずだと思う:

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON c.id = COALESCE(b.c_id, a.c_id) 

b.c_idがNULLである場合には、その後、a.c_idが使用されます。それ以外の場合はb.c_idが使用されます。

速度に関してではありません。 ORaに各行のb.c_ida.c_idのマッピングを含むすべての可能な結果行を表示します。

COALESCE()に精通していない場合は、この形式の長い形式はクエリとほとんど同じですが、ORではなくIF()を使用しています。

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON IF(b.c_id IS NOT NULL, b.c_id = c.id, a.c_id = c.id) 
0

これは役立つかもしれない試してみてください。

SELECT a.*, c.name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON (b.c_id IS NOT NULL OR b.c_id = c.id) OR a.c_id = c.id 
+0

これは指数関数的な一致数を与えます。 'b'のすべての行は' NULL'ではなく、 'c'のすべての行と一致します。 – ebyrob

+0

b.c_idを削除する – Minh

関連する問題