2017-06-21 110 views
-1

我想獲得一份MySQL報告,但什麼也沒有。請指出有什麼不對?我檢查了這個相似的question,但無法找到解決我的問題。MySQL加入自己的表

表值

 
+----+-----+----------+---------+-----------+-----------+ 
| 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' [鏈接](https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat) – Ryan

回答

3

這些數據模型看起來可怕的我。但無論如何,如果你想外接表格,不要在WHERE條款中加入標準。外連接記錄的所有值都設置爲空,因此o2.ind=$ind永遠不會成爲這樣的記錄。你最終得到一個內部連接,從而解散整行。請將您的加入條件改爲ON條款。

您還混淆了連接中的ID。 o是您的主要選項(例如「襯衫」),o1是其第一選項(即顏色,例如'綠色'),因此它必須是o1.pk = o.opt_type1,而不是o1.opt_type1 = o.pk

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