如何正确连接两个有条件的mysql表?

时间:2011-04-19 18:10:26

标签: php mysql join

我在解决这个问题时遇到了一些困难。我确定有一个解决方法,但我正在尝试使用单个查询。我有两个条件加入两张桌子。我需要返回匹配'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'的行。

任何想法都有帮助。

谢谢!

1 个答案:

答案 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;