如何在第二个变量并不总是存在的同一表上MySQL左联接

时间:2019-04-16 21:36:47

标签: mysql mysqli

我们有一个表来存储主要条目和与那些条目相关的设置。主条目会获得一个唯一的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建议对这两个列都建立索引的建议确实有效。谢谢。

0 个答案:

没有答案