2017-06-21 19 views
-1

MySQLレポートを取得しようとしていますが、何も取得しようとしていません。何が間違っているかを指摘してください。私はこの同様のquestionを確認したが、私の問題に解決策を見つけることができません。MySQL自分自身にテーブルを結合

TABLEは、データモデルは、私には恐ろしい見えること

 
+----+-----+----------+---------+-----------+-----------+ 
| pk | ind | opt_type | name | opt_type1 | opt_type2 | 
+----+-----+----------+---------+-----------+-----------+ 
| 1 | 1 | group_1 | Green | -   | -   | 
| 2 | 1 | group_1 | Red  | -   | -   | 
| 3 | 1 | group_2 | Cloth | -   | -   | 
| 4 | 1 | group_3 | Shirt | 1   | 3   | 
| 5 | 1 | group_4 | Table | 2   | -   | 
+----+-----+----------+---------+-----------+-----------+ 

必要な出力

 
name | colour | material 
------+--------+--------- 
Shirt | Green | Cloth 
Table | Red | 

QUERY & CODE

SELECT 
    o.name   
    , o1.name as colour 
    , o2.name as material 

    FROM $options as o 
    LEFT JOIN $options AS o1 ON o1.opt_type1 = o.pk 
    LEFT JOIN $options AS o2 ON o2.opt_type2 = o.pk      

    WHERE o.ind=$ind 
    AND o1.ind=$ind 
    AND o2.ind=$ind 


    LOOP{ 
    echo $name ." ". $colour ." ". $material; 
    } 
+0

「$ options」と「$ ind」を実際の値に置き換えて最後のクエリを表示してください。 –

+0

$ optionsには何か – JYoThI

+0

'GROUP_CONCAT' [link](https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat)を使って見てください – Ryan

答えて

3

値。しかし、とにかくテーブルを外部結合したい場合は、WHERE節に条件を設定しないでください。外部結合レコードはすべての値がNULLに設定されているため、o2.ind=$indはそのようなレコードに対して真になることはありません。あなたは内部結合で終わるので、完全な行を却下します。あなたの参加基準をON句に入れてください。

また、結合のIDを混同しました。主なオプション(例: 'シャツ')はoで、o1が最初のオプションです(例: 'グリーン'などの色)ので、ではなくo1.pk = o.opt_type1である必要があります。

SELECT 
    o.name   
, o1.name as colour 
, o2.name as material 
FROM $options as o 
LEFT JOIN $options AS o1 ON o1.pk = o.opt_type1 AND o1.ind = o.ind 
LEFT JOIN $options AS o2 ON o2.pk = o.opt_type2 AND o2.ind = o.ind 
WHERE o.ind = $ind AND (o.opt_type1 is not null or o.opt_type2 is not null); 
+0

実際の問題は非常に抽象的で、ここで私は問題を再現しようとしました。あなたの解決策を試してみましょう。 – MyO

関連する問題