我们有一个表来存储主要条目和与那些条目相关的设置。主条目会获得一个唯一的ID,然后设置会在称为“ pid”的列中使用该ID-父ID。
我们正在尝试将主条目与设置左联接,但是,并非所有条目都具有相同数量的设置。
这是表格的示例。
+----+---------+-----+--------+
| id | type | pid | value |
+----+---------+-----+--------+
| 1 | main | | andrew |
| 2 | email | 1 | val1 |
| 3 | tel | 1 | val2 |
| 4 | main | | peter |
| 5 | email | 4 | val3 |
+----+---------+-----+--------+
查询当前如下所示:
mysql >
SELECT * FROM table a
LEFT JOIN table b ON b.pid=a.id
LEFT JOIN table c ON c.pid=a.id
WHERE a.type='main' AND b.type='email' AND c.type='tel'
我们希望输出看起来像这样:
+----+---------+-----+--------+----+---------+-----+--------+----+---------+-----+--------+
| id | type | pid | value | id | type | pid | value | id | type | pid | value |
+----+---------+-----+--------+----+---------+-----+--------+----+---------+-----+--------+
| 1 | main | | andrew | 2 | email | 1 | val1 | 3 | tel | 1 | val2 |
+----+---------+-----+--------+----+---------+-----+--------+----+---------+-----+--------+
| 1 | main | | peter | 4 | email | 1 | val3 | | | | |
+----+---------+-----+--------+----+---------+-----+--------+----+---------+-----+--------+
但是,LEFT JOIN会排除不存在的条目(即本示例中的电话设置)。
使用以下查询时查询确实会运行:
mysql >
SELECT a.id,
(SELECT value FROM table WHERE type='email' AND pid=a.id) AS email,
(SELECT value FROM table WHERE type='tel' AND pid=a.id) AS tel,
FROM table a WHERE a.type='main'
但这真的效率很低。
表结构可能并不理想,但这是我们必须解决的问题。
谢谢:)
更新:感谢@Barmar建议将部分条件移至from子句,但是,这实际上仍然很慢。如果我们做对了,这就是他建议打的电话:
mysql >
SELECT * FROM table a
LEFT JOIN table b ON b.pid=a.id AND b.type='email'
LEFT JOIN table c ON c.pid=a.id AND c.type='tel'
WHERE a.type='main'
这确实会产生期望的结果(不存在条目的NULL值),但是只是想知道是否有更有效的方法?这比上面提到的多个选择语句还要慢。
谢谢。
更新2:@Barmar建议对这两个列都建立索引的建议确实有效。谢谢。