/ / mysqlグループをクエリで使用する方法 - mysql、group-by、status

mysqlグループのクエリの使い方 - mysql、group-by、status

Name、EmailId、Process、Statusという列のテーブルがあります。

**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

今私が望むのは、すべてのプロセス - プロセス1、プロセス2、プロセス3のステータスが閉じられている人の電子メールIDとステータスです。

**Output**

EmailId              Status
orange@fruits.com    Closed

オレンジのためのすべてのプロセスが閉じられているので、私は上記の行を持っている 同様に、プロセスが閉じられているテーブルのすべての電子メールIDを取得したいと思います。

回答:

回答№1は2

別の方法:

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

または:

SELECT
t.EmailId
FROM
( SELECT DISTINCT EmailId
FROM tableX
) AS t
LEFT JOIN
tableX AS tt
ON  tt.EmailId = t.EmailId
AND tt.Status <> "Closed"
WHERE
tt.EmailId IS NULL ;

回答№2の場合は3

これを見つけるには、集約を使用することができます COUNT() カウント= 3が 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)