我在查询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的内容,不应该这样吗?我错过了什么?
由于
答案 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)