Mysql sql查询中带总和聚合的Where子句
我有一个表,我只想显示那些至少有一个注册用户的部门。我的问题如下:Mysql sql查询中带总和聚合的Where子句,mysql,aggregate-functions,mysql-workbench,Mysql,Aggregate Functions,Mysql Workbench,我有一个表,我只想显示那些至少有一个注册用户的部门。我的问题如下: SELECT departments.id as DepartmentID, departments.depName as DepartmentName, SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers FROM (myDB.departments) LEFT JOIN myDB.users ON departmentID=departments.
SELECT departments.id as DepartmentID,
departments.depName as DepartmentName,
SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers
FROM (myDB.departments)
LEFT JOIN myDB.users ON departmentID=departments.id
AND `departments`.`isDelete` = 0
HAVING SUM(NumberOfUsers) >=0
SUM(NumberOfUsers)>=0的根本不起作用。我想检查NumberOfUsers
是否超过一个,然后显示它。如果不超过一个,则不显示它。有什么建议吗?试试这个:
SELECT departments.id as DepartmentID,
departments.depName as DepartmentName,
(SELECT COUNT(u.id)
FROM users u
WHERE u.departmentID = d.id) as NumberOfUsers
FROM departments d
WHERE d.isdelete = 0
AND EXISTS
(SELECT 'user'
FROM users u
WHERE u.departmentID = d.id)
这样,您就不会在主查询中使用求和(在主查询中,您必须使用GROUP BY来显示其他标量字段,如departments.id和departments.depName。在我的Sql中,GROUP BY不是必需的)
EXISTS子句保证存在至少一个用户。如果要显示所有部门(独立的用户数,删除EXISTS子句)在这种情况下,还需要使用group by
子句
SELECT departments.id as DepartmentID,
departments.depName as DepartmentName,
SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers
FROM (myDB.departments)
LEFT JOIN myDB.users ON departmentID=departments.id
AND `departments`.`isDelete` = 0
GROUP BY departments.id, departments.depName
HAVING SUM(IF(users.isDelete=0, 1, 0)) >=0
但是如果您想要一个简短的答案,您可以使用JOIN
而不是LEFT JOIN
并删除HAVING
子句:
SELECT departments.id as DepartmentID,
departments.depName as DepartmentName,
SUM(IF(users.isDelete=0, 1, 0)) AS NumberOfUsers
FROM (myDB.departments)
JOIN myDB.users ON departmentID=departments.id
AND `departments`.`isDelete` = 0
GROUP BY departments.id, departments.depName
我认为您可以简化查询,因为您正在检查用户表中的条件,即_delete应该为0,所以不需要左连接,您可以使用普通连接。在此之后,您将通过having子句删除所有没有记录的行,所以您只需将此条件放入where子句中,如下所示-
SELECT dpt.id AS DepartmentID, dpt.depName AS DepartmentName,
COUNT(usr.id) AS NumberOfUsers
FROM myDB.departments AS dpt
JOIN myDB.users AS usr ON usr.departmentID=dpt.id
WHERE dpt.`isDelete` = 0 AND usr.isDelete=0
注意:假设users表的主键是id,如果不是,那么您可以使用count函数中的任何其他列。不止一个是SUM(NumberOfUsers)>=1
亲爱的,是Sql Server还是我的Sql?您的have运行得很好,而不是根本没有。你只是写错了。您希望>0,而不是>=0。此外,用户数已经相加,因此只需使用NumberOfUsers>0即可。还有分组。还可以进行内部联接并使用where users.numberofusers>0。为什么有sum??我认为您需要计算用户数??在这种情况下,您还需要使用groupby
子句:这里是否需要求和??可以将count和where子句一起用于isdelete???@VishalJAIN,这也应该可以,但我试图尽可能多地保留原始代码。我注意到它只返回了一行@哪一个?如果执行查询时没有分组方式,是否有多行?请对此进行upvote。这看起来很复杂,但我觉得很有趣。