MySQL查询(分组方式)
我有两张桌子 一个日志。电子邮件:MySQL查询(分组方式),mysql,sql,Mysql,Sql,我有两张桌子 一个日志。电子邮件: EmailNum EmployeeID, Emailcontent, EmailReceivers ,is_read 1 1 , "sasa" , "sas@google.com" ,1 2 1 , "sasa" , "sas@google.com" ,0 3 2 , "sasa" , "sas@g
EmailNum EmployeeID, Emailcontent, EmailReceivers ,is_read
1 1 , "sasa" , "sas@google.com" ,1
2 1 , "sasa" , "sas@google.com" ,0
3 2 , "sasa" , "sas@google.com" ,0
4 2 , "sasa" , "sas@google.com" ,0
5 2 , "sasa" , "sas@google.com" ,0
和Employees.user
id, FirstName, LastNAme
1 , "John" , "Brown"
2 , "Jack" , "James"
我的期望输出:
名字、姓氏、数字符号约翰,布朗,1
杰克,詹姆斯,3岁 我的尝试(但它没有返回所需输出的第一行,即“John,Brown,1”): 非常感谢您的帮助请尝试以下方法:
SELECT b.FirstName, b.LastName,
sum( case
when a.is_read=0 than 1
else 0
end ) as NumOfUnreadEmails
FROM logs.emails a
inner join Employees.user b on a.EmployeeID=b.id
group by b.FirstName, b.LastName
试着这样做:
SELECT b.FirstName, b.LastName,
sum( case
when a.is_read=0 than 1
else 0
end ) as NumOfUnreadEmails
FROM logs.emails a
inner join Employees.user b on a.EmployeeID=b.id
group by b.FirstName, b.LastName
您应该在此处指定一个
WHERE
子句,而不是使用HAVING
,因为在进行任何聚合之前,您试图筛选出具有is_read=0
的记录
另外,为了只获取所需的字段,不要使用*
。只需指定所需的字段
SELECT
b.FirstName, b.LastName, COUNT(a.EmailNum)
FROM
logs.emails a
inner join
Employees.user b on a.EmployeeID=b.id
where
a.is_read='0'
group by
b.id
您应该在此处指定一个
WHERE
子句,而不是使用HAVING
,因为在进行任何聚合之前,您试图筛选出具有is_read=0
的记录
另外,为了只获取所需的字段,不要使用*
。只需指定所需的字段
SELECT
b.FirstName, b.LastName, COUNT(a.EmailNum)
FROM
logs.emails a
inner join
Employees.user b on a.EmployeeID=b.id
where
a.is_read='0'
group by
b.id
这将返回所有员工,包括根本没有电子邮件的员工。如果只想显示有未读电子邮件的邮件,可以将
左连接
更改为内部连接
SELECT
u.FirstName,
u.LastName,
COUNT(e.EmployeeID) AS NumOfUnreadEmails
FROM
Employees.user u
LEFT JOIN logs.emails e ON e.EmployeeID = u.id AND e.is_read = 0
GROUP BY
u.id
这将返回所有员工,包括根本没有电子邮件的员工。如果只想显示有未读电子邮件的邮件,可以将
左连接
更改为内部连接
SELECT
u.FirstName,
u.LastName,
COUNT(e.EmployeeID) AS NumOfUnreadEmails
FROM
Employees.user u
LEFT JOIN logs.emails e ON e.EmployeeID = u.id AND e.is_read = 0
GROUP BY
u.id
杰克·詹姆斯应该有上面2号的身份证吗?他们现在都有相同的id。是的,更正,谢谢你不能做
*,计数(
因为你必须对所有列进行分组。你只是想从员工那里得到*吗。用户
?是的;我还需要未读电子邮件的数量!Jack James是否应该有2个以上的id?他们目前都有相同的id。是的,更正,谢谢你不能做*,计数(
因为你必须对所有列进行分组。你只是想从员工那里获得*吗。用户
?是的;我还需要未读电子邮件的数量!这不会返回没有未读电子邮件或根本没有电子邮件的员工。也许这没关系,但这是需要注意的。我也不想返回!这并没有被提及为这是一个要求,但如果需要,您可以参考您提供的答案,它提供了这个结果。我不是说两者都更好。只是指出不同之处。:)谢谢您的评论;它也帮助了我:)这不会返回没有未读电子邮件或根本没有电子邮件的员工。也许这没关系,但这是需要注意的。我也不想返回!这不是一项要求,但如果需要,您可以参考您提供的提供此结果的答案。我不是说两者都更好。只是指出t他说:)谢谢你的评论;这对我也有帮助:)这太接近了!但是聚合确实需要类似于COUNT(e.EmployeeID)
,这样,对于没有未读电子邮件的用户,我们可以得到一个零计数。@spencer7593你说得很对。谢谢你,先生,我已经修好了。是的,那是票。我们可能会注意到,logs.emails(EmployeeID,is_read)上的“覆盖索引”(如)可能会显著提高查询的性能。(现在只需删除LEFT
关键字就可以消除计数为零的行。)我们还可以提到,其他DBMS将需要“按u.FirstName、u.LastName
分组”(即选择列表中的所有非聚合)。但是上面的查询对MySQL是有效的,但这是一个错误,因为MySQL特定的扩展不符合SQL-92。这太接近了!但是聚合确实需要类似于COUNT(e.EmployeeID)
,这样,对于没有未读电子邮件的用户,我们可以得到一个零计数。@spencer7593你说得很对。谢谢你,先生,我已经修好了。是的,那是票。我们可能会注意到,logs.emails(EmployeeID,is_read)上的“覆盖索引”(如)可能会显著提高查询的性能。(现在只需删除LEFT
关键字就可以消除计数为零的行。)我们还可以提到,其他DBMS将需要“按u.FirstName、u.LastName
分组”(即选择列表中的所有非聚合)。但是上面的查询对于MySQL是有效的,但这是一个错误,因为MySQL特定的扩展不符合SQL-92。对于没有任何电子邮件的employees.user,这不会返回零计数。有几种方法可以编写返回零计数的语句,以及(可能)通过在logs.emails.is_read=0
上包含谓词来提高性能。对于没有任何电子邮件的任何雇员。用户,这不会返回零计数。有几种方法可以编写返回零计数的语句,以及(可能)通过在logs.emails.is_read=0