如何使用mysql分组查询

如何使用mysql分组查询,mysql,group-by,status,Mysql,Group By,Status,我有一个列名、EmailId、进程、状态的表,如下所示 **Input** Name EmailId Process Status apple1 apple@fruits.com process1 Closed apple2 apple@fruits.com process2 In Progress apple3 apple@fruits.com

我有一个列名、EmailId、进程、状态的表,如下所示

**Input**

   Name       EmailId                Process      Status    
   apple1     apple@fruits.com       process1     Closed
   apple2     apple@fruits.com       process2     In Progress
   apple3     apple@fruits.com       process3     Complete      
   orange1    orange@fruits.com      process1     Closed
   orange2    orange@fruits.com      process2     Closed
   oran       orange@fruits.com      process3     Closed
   mango1     mango@fruits.com       process1     To Start
现在我想要的是emailId和所有流程中处于关闭状态的人员的状态-流程1、流程2、流程3

**Output**

EmailId              Status    
orange@fruits.com    Closed
由于橙色的所有过程都已结束,我有上面一行
类似地,我希望关闭其进程的表的所有电子邮件ID。

要查找此项,您可以使用聚合计数来查找HAVING子句中的计数=3,因此所有三个都已关闭:

SELECT
  EmailId,
  /* How many different processes are closed per EmailId */
  COUNT(DISTINCT Process) AS numclosed
FROM
  yourtable
WHERE Status = 'Closed'
GROUP BY EmailId
/* Return only those with 3 processes closed */
HAVING numclosed = 3
如果可能的进程数不完全是3,您需要考虑所有进程,我相信您可以使用HAVING子句中的子查询来查找可能进程的实际数目

SELECT
  EmailId,
  COUNT(DISTINCT Process) AS numclosed
FROM
  yourtable
WHERE Status = 'Closed'
GROUP BY EmailId
/* Compare the number closed for this EmailId against the number of possible Process values in the table */
HAVING numclosed = (SELECT COUNT(DISTINCT Process) FROM yourtable)

要找到该值,可以使用聚合计数来查找HAVING子句中的计数=3,因此所有三个都是闭合的:

SELECT
  EmailId,
  /* How many different processes are closed per EmailId */
  COUNT(DISTINCT Process) AS numclosed
FROM
  yourtable
WHERE Status = 'Closed'
GROUP BY EmailId
/* Return only those with 3 processes closed */
HAVING numclosed = 3
如果可能的进程数不完全是3,您需要考虑所有进程,我相信您可以使用HAVING子句中的子查询来查找可能进程的实际数目

SELECT
  EmailId,
  COUNT(DISTINCT Process) AS numclosed
FROM
  yourtable
WHERE Status = 'Closed'
GROUP BY EmailId
/* Compare the number closed for this EmailId against the number of possible Process values in the table */
HAVING numclosed = (SELECT COUNT(DISTINCT Process) FROM yourtable)
另一种方式:

SELECT 
    EmailId
FROM
    tableX AS t
GROUP BY 
    EmailId
HAVING
    COUNT( CASE WHEN Status <> 'Closed'
             THEN 1 
           END
         ) = 0 ;
或:

另一种方式:

SELECT 
    EmailId
FROM
    tableX AS t
GROUP BY 
    EmailId
HAVING
    COUNT( CASE WHEN Status <> 'Closed'
             THEN 1 
           END
         ) = 0 ;
或:


@aprilleocean如果不是您要求的,它会返回什么?如果您也希望返回状态,则没有必要,因为它已知已关闭。如果列表中的进程发生变化,count可能无法工作,例如如果他想检查proc1、proc2、proc4是否已关闭,但某些id具有proc1、proc2、,proc3 closed.@NaveenKumar OP特别要求关闭所有进程,@aprilleocean完全按照上述任何一个示例复制,但在不使用HAVING子句的情况下运行它。它应该返回一行苹果和橘子。With HAVING子句应该只返回橙色。@APRILLEOSEAN那么如果不是您要求的,它会返回什么呢?如果您也希望返回状态,则没有必要,因为它已知已关闭。如果列表中的进程发生变化,计数可能不起作用,例如,如果他想检查proc1、proc2、proc4是否已关闭,但某些id具有proc1,proc2,proc3 closed.@navenkumar OP特别要求关闭所有进程,@aprilleocean复制上述任何一个示例,但在不使用HAVING子句的情况下运行它。它应该返回一行苹果和橘子。With HAVING子句应该只返回橙色。竖起大拇指,它起作用了。谢谢,所以MuchMichael的查询也应该起作用。除非您每封电子邮件的进程数可变,而不是问题所暗示的常数3。@ypercube Michael query不会返回任何记录集Thumbs它成功了,谢谢您,所以MuchMichael的查询也应该成功。除非您的每封电子邮件有可变的进程数,而不是问题所暗示的常数3。@ypercube Michael query不会返回任何记录集