use*_*659 7 mysql select count distinct
如果有人可以验证我的SQL查询,我真的很感激.
对于以下数据集:
MD5 UserPK CategoryPK
ADCDE 1 7
ADCDE 1 4
ADCDE 1 7
dffrf 1 7
dffrf 2 7
dffrf 2 6
dffrf 1 1
Run Code Online (Sandbox Code Playgroud)
我想选择MD5和CategoryPK,其中两行或更多行存在相同的MD5值,相同的CatgegoryPK和两个或更多不同的UserPK值.
换句话说,我想知道两个或多个不同用户(UserPK)已将同一类别(UserPK)分配给同一文件(Md5)的所有记录的MD5和categoryPK.我对同一用户多次分配类别的记录不感兴趣(除非另一个用户也为该文件分配了相同的类别).
所以从上面的数据来看,我想直接返回:
md5 CategoryPK
dffrf 7
Run Code Online (Sandbox Code Playgroud)
我写的查询是:
SELECT md5,
count(md5),
count(distinct categorypk) as cntcat,
count(distinct userpk) as cntpk
FROM Hash
group by md5 having count(md5) > 1
and cntpk > 1
and cntcat = 1;
Run Code Online (Sandbox Code Playgroud)
它似乎有效,但在我开始使用它之前,我会欣赏第二种意见,以防我错过了某些内容或者是否有更好的方法.
谢谢
egg*_*yal 11
我认为你的代码不会给你你所追求的东西; 如果多个用户为一个文件分配了多个类别,某些类别重叠,会发生什么?然后cntcat != 1,HAVING即使文件确实被多个用户以相同的方式分类,因此您的子句将无法匹配.
我会改为使用自联接:
SELECT a.MD5, a.CategoryPK
FROM Hash a
JOIN Hash b
ON a.MD5 = b.MD5
AND a.UserPK <> b.UserPK
AND a.CategoryPK = b.CategoryPK
GROUP BY a.MD5, a.CategoryPK
HAVING COUNT(DISTINCT a.UserPK) > 2 -- you said "more than 2" ?
Run Code Online (Sandbox Code Playgroud)