所以我的问题是,假设我有 3 个表:“customerPerAdmin”、“admins”、“customers” 我正在加入他们,但是如果某个用户的 customerPerAdmin.AdminID 为 0 怎么办? 如果它会忽略 adminID 等于 0 的客户,会发生什么,我不希望这种情况发生,我想将 admins.FirstName 和 admin.LastName 设置为空。
customerPerAdmin 表:
ID AdminID CustomerID
40 20 49
41 25 48
42 20 50
43 0 51
这是查询
SELECT SQL_CALC_FOUND_ROWS `customers.UniqID`,
`customerPerAdmin`.`AdminID`,
`customerPerAdmin`.`CustomerID`,
`customerPerAdmin`.`IsDeleted`,
`customerPerAdmin`.`pr`,
`admins`.`ID`,
`admins`.`GroupID`,
`admins`.`FirstName` AS adminFirstName,
`admins`.`LastName` AS adminLastName,
`admins`.`IsDeleted`,
`customers`.`FirstName`,
`customers`.`LastName`,
`customers`.`Phone`,
`customers`.`Email`,
`customers`.`GroupID`,
`customers`.`UniqID`,
`customers`.`Created`,
`customers`.`IsDeleted`,
`customers`.`ID`
FROM (`customers`)
JOIN `customerPerAdmin` ON `customers`.`ID`=`customerPerAdmin`.`CustomerID`
JOIN `admins` ON `admins`.`ID`=`customerPerAdmin`.`AdminID`
AND `customers`.`GroupID` = '8'
AND `customerPerAdmin`.`pr` = 0
GROUP BY `customers`.`ID`
ORDER BY `customers`.`ID` DESC LIMIT 20
那么会发生什么,它只会向我显示 ID 40,41,42 而不是 43,因为他无法将其与 ID 为 0 的管理员关联起来,因为他不存在。 即使不相关,我如何仍能显示 ID 43?
提前致谢。
最佳答案
在您的代码中,您需要从 INNER JOIN
更改为 LEFT OUTER JOIN
通过使用INNER JOIN
,您将强制匹配所有行。 LEFT OUTER JOIN
可让您获取主表中的所有行以及连接表中的所有匹配记录。
这是快速而肮脏的JOIN
类(class)
INNER JOIN
或 JOIN
从所有行都匹配的表中获取数据
LEFT OUTER JOIN
或 LEFT JOIN
从主表中获取数据,并且仅从数据可以匹配的连接表中获取数据。
FULL OUTER JOIN
或 FULL JOIN
获取两个表中的所有数据并尽可能匹配。
还有RIGHT
join,但我从不使用它。它与 LEFT
相同,只是将另一个表作为主要源。有些人在同一个查询中同时使用 LEFT
和 RIGHT
,此时我开始怀疑他们是否知道自己在做什么。
除了评论中的链接外,您还可以查看Join Fundamentals from Microsoft
关于mysql - SQL连接表与空数据检索无,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22490316/