(可选)WHERE子句(Mysql查询

时间:2012-08-10 17:51:51

标签: mysql sql left-join where-clause

我在MySQL中遇到一个SELECT查询有点问题,我会感谢你的一些指示。请随时指出我现有的答案(如果有的话我错过了)。

查询目前如下:

SELECT e.*, ie.aaa, ue.bbb, ue.ccc
FROM ie
LEFT JOIN e ON ie.e_id = e.e_id
LEFT JOIN ue ON ie.e_id = ue.e_id
WHERE ie.other_id = ? AND ue.unrelated_id = ?
ORDER BY ...

有三个表: e ue

ie ue e 的关系,因此包含外键(e_id)。 表示输入参数。

问题是 ue.unrelated_id =?部分。我尝试做的事情是:

  • 当且仅当unlated_id =?存在ue关系时才返回ue.ccc。如果它不存在,我希望此字段为空。
  • 即使ulate关系为unrelated_id =?如果不存在,此查询应始终返回其余字段(即,对于other_id =?,保证存在)。

不幸的是,如果我删除这个where子句,我会获得ue.ccc作为“随机”的unrelated_id。但是如果我保留它,如果这个unrelated_id不存在,查询将不会返回任何结果!我也尝试添加OR ue.unrelated_id IS NOT NULL,但如果ue表为空,这会使查询返回结果。

有什么想法吗?如果您需要进一步说明,请发表评论。我应该在接下来的几个小时内迅速回答。

1 个答案:

答案 0 :(得分:8)

你可以做以下两件事之一:

SELECT e.*, ie.aaa, ue.bbb, ue.ccc
FROM ie
LEFT JOIN e ON ie.e_id = e.e_id
LEFT JOIN ue ON ie.e_id = ue.e_id AND ue.unrelated_id = ?
WHERE ie.other_id = ? 
ORDER BY ...

或者

SELECT e.*, ie.aaa, ue.bbb, ue.ccc
FROM ie
LEFT JOIN e ON ie.e_id = e.e_id
LEFT JOIN ue ON ie.e_id = ue.e_id
WHERE ie.other_id = ? AND (ue.unrelated_id IS NULL OR ue.unrelated_id = ?)
ORDER BY ...

然而,我会使用第一个查询。

编辑:请注意,如果ue.unrelated_id不是可以为空的列,则第二个查询仅适用。