Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询(分组方式)_Mysql_Sql - Fatal编程技术网

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