如果其中一个表为空,则涉及OR的sql查询将不返回结果

时间:2012-04-12 16:31:44

标签: mysql

我在查询mysql db

的查询时遇到了一个小问题
SELECT s.*
FROM section AS s, sectioncompany AS scom
WHERE ((s.restricted = 0 ) OR (s.restricted = 1 AND s.id = scom.sectionId AND scom.companyId = $companyId))

这样可以正常工作并在sectioncompany表中有条目时返回结果,但是当该表为空时,查询不会产生任何结果。目前我只是通过向sectioncompany表添加一个空记录来解决方法,但我想了解我忽略了什么。正如您所看到的,一旦表为空,就不会满足涉及该表中现有值的条件,但它仍应返回s.restricted = 0的内容,不应该这样吗?我错过了什么?

由于

3 个答案:

答案 0 :(得分:2)

这里的问题是你正在使用INNER JOIN(通过使用WHERE子句匹配on(s.id = scom.sectionId)。你想要的是LEFT JOIN:

SELECT s.*
FROM section s
LEFT JOIN sectioncompany scom ON (s.id = scom.sectionId)
WHERE ((s.restricted = 0 ) OR (s.restricted = 1 and scom.companyId = $companyId))

答案 1 :(得分:1)

这是因为您正在使用交叉连接,它为源表中的每个行组合返回一行。如果其中一个表没有行,那么就没有可能的组合。

如果可能,请告诉我们您要尝试实现的内容,使用架构和数据,并且有人可能会建议正确的SQL。

答案 2 :(得分:1)

使用明确的JOIN代替笛卡尔联接,因此您可以LEFT JOIN并且问题应该消失:

SELECT `s`.*
FROM `section` `s`,
LEFT JOIN `sectioncompany` `c` ON `s`.`id` = `c`.`sectionId`
WHERE `s`.`restricted` = 0
  OR (`s`.`restricted` = 1 AND `c`.`companyId` = $companyId)