我在解决这个问题时遇到了一些困难。我确定有一个解决方法,但我正在尝试使用单个查询。我有两个条件加入两张桌子。我需要返回匹配't_id'的所有行(即使是NULL)。我还需要只加入匹配'e_id'的数据。如果'e_id'不存在,则应返回NULL。以下查询返回我需要的所有行:
SELECT b.*, ev.* FROM blocks b
LEFT OUTER JOIN element_values ev ON ev.b_id = b.id
WHERE t_id = 1;
+----+------+-----------+-----+------+------+-----------------+
| id | t_id | type | pos | e_id | b_id | value |
+----+------+-----------+-----+------+------+-----------------+
| 1 | 1 | textinput | 1 | 1 | 1 | this is it edit |
| 2 | 1 | textinput | 0 | 1 | 2 | what is it |
| 5 | 1 | template | 2 | NULL | NULL | NULL |
+----+------+-----------+-----+------+------+-----------------+
但是为'e_id'添加另一个条件将返回准确的数据,但如果它是NULL(当然)将排除第三行。
SELECT b.*, ev.* FROM blocks b
LEFT OUTER JOIN element_values ev ON ev.b_id = b.id
WHERE t_id = 1 AND e_id = 1;
+----+------+-----------+-----+------+------+-----------------+
| id | t_id | type | pos | e_id | b_id | value |
+----+------+-----------+-----+------+------+-----------------+
| 1 | 1 | textinput | 1 | 1 | 1 | this is it edit |
| 2 | 1 | textinput | 0 | 1 | 2 | what is it |
+----+------+-----------+-----+------+------+-----------------+
我正在寻找一种解决方案,如果'e_id'不存在,仍会返回所有三行。例如,对于最后一个查询,当我传递'e_id = 2'时,该集将为空。但是,我需要它仍然返回所有等于't_id'的行。
任何想法都有帮助。
谢谢!
答案 0 :(得分:3)
您可以在LEFT JOIN子句中包含eid = 1以获取所需的行。
将查询更改为:
SELECT b.*, ev.*
FROM blocks b LEFT OUTER JOIN element_values ev
ON ev.b_id = b.id
AND e_id = 1
WHERE t_id = 1;