2017-06-21 57 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