当其中一个WHERE条件导致false时,MySQL查询给出null值
我在使用MySQL查询时遇到问题。 我有两个表,即用户和项目。我正在尝试获取项目名称和在特定项目中工作的用户数。下面是我正在使用的查询当其中一个WHERE条件导致false时,MySQL查询给出null值,mysql,Mysql,我在使用MySQL查询时遇到问题。 我有两个表,即用户和项目。我正在尝试获取项目名称和在特定项目中工作的用户数。下面是我正在使用的查询 SELECT b.projName AS project_name, COUNT(a.empId) AS project_strength FROM users a, projects b WHERE b.projName LIKE '%windows%' AND (a.empProjId = b.projId) 在
SELECT b.projName AS project_name,
COUNT(a.empId) AS project_strength
FROM users a,
projects b
WHERE b.projName LIKE '%windows%' AND
(a.empProjId = b.projId)
在这种情况下,当没有用户为项目工作时(users表中没有empProjId与projId of projects表匹配的行),即使项目存在于projects表中,并且like子句匹配,我也会将项目名称设置为null。在这种情况下,我希望显示项目名称,并且计数为0
我是个初学者,不知道这是否可能。任何帮助都将不胜感激。
非常感谢。对于这些事情,您需要使用
左联接
,这将强制DB从查询的“左”端返回所有相关记录(从表返回),无论查询的“右”端(从联接
表)是否有任何匹配的记录:
“lazy join”版本的等效语法为
WHERE b.projName LIKE '%windows%' AND
((a.empProjId = b.projId) OR (b.projID IS NULL))
您只需执行以下操作:
SELECT b.projName AS project_name,
COUNT(a.empId) AS project_strength
FROM projects b
LEFT JOIN users a ON a.empProjId = b.projId
WHERE b.projName LIKE '%windows%'
GROUP BY b.projName
LEFT JOIN将确保您始终获得项目名称,即使用户中没有匹配项。您应该使用LEFT JOIN和带有group by的计数
SELECT b.projName AS project_name,
count(b.projName) AS project_strength
FROM projects b LEFT JOIN
users a ON (b.projId = a.empProjId)
WHERE b.projName LIKE '%windows%'
group by b.projName
我已经发现您的数据库可能存在设计问题。员工是否可以链接到多个项目?我想是的(不一定是在运行项目,但也可能是老项目)。在这种情况下,您应该有一个第三个表,其中包含两个字段:projectId和userId,以便将多个项目链接到给定的用户,将多个用户链接到给定的项目(=多对多关系)。对于其余的,答案可能会帮助你…@Bartdude非常感谢你的回答。是的,一些用户可能在多个项目中工作。我会记住这一点,并进行必要的更改。非常感谢您的回复。在我交换了连接顺序后,上面的方法起了作用。我的意思是项目b左加入用户a
SELECT b.projName AS project_name,
count(b.projName) AS project_strength
FROM projects b LEFT JOIN
users a ON (b.projId = a.empProjId)
WHERE b.projName LIKE '%windows%'
group by b.projName