MySQL将表连接到自身

时间:2017-06-21 10:13:36

标签: mysql sql

我正在尝试获取MySQL报告,但什么都没得到。请指出有什么问题?我检查了类似的question,但无法找到解决问题的方法。

TABLE VALUES

+----+-----+----------+---------+-----------+-----------+
| 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;
    }

1 个答案:

答案 0 :(得分:3)

这个数据模型对我来说太可怕了。但无论如何,如果你想要加入一个表,不要在WHERE子句中加上标准。外连接记录的所有值都设置为null,因此对于这样的记录,o2.ind=$ind永远不会为真。你最终得到了一个内部联接,从而解雇了整行。将您的加入条件改为ON子句。

您还混淆了连接中的ID。 o是您的主要选择(例如'衬衫')o1是它的第一个选项(即颜色,例如' Green'),所以它必须是{ {1}},而不是o1.pk = o.opt_type1

o1.opt_type1 = o.pk