0

我在找出这个查询到 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 的值,不是吗?我错过了什么?

谢谢

4

3 回答 3

2

这里的问题是您使用的是 INNER JOIN(通过使用 WHERE 子句匹配 (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))
于 2012-04-12T16:36:08.297 回答
1

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

让我们知道您想要实现的目标,如果可能的话,使用模式和数据,有人可能会建议正确的 SQL。

于 2012-04-12T16:35:23.277 回答
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)
于 2012-04-12T16:37:04.370 回答