如何使用mysql分组查询
我有一个列名、EmailId、进程、状态的表,如下所示如何使用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
**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不会返回任何记录集