【问题标题】:Mysql Select rows with same values in one column and different in anotherMysql选择一列中具有相同值而另一列中具有不同值的行
【发布时间】:2012-05-25 21:00:07
【问题描述】:

如果有人能验证我的 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 

我想选择 MD5 和 CategoryPK,其中两行或多行具有相同的 MD5 值、相同的 CatgegoryPK 和两个或更多不同的 UserPK 值。

换句话说,我想知道两个或多个不同用户 (UserPK) 已将同一类别 (UserPK) 分配给同一文件 (Md5) 的所有记录的 MD5 和 categoryPK。我对同一用户多次分配类别的记录不感兴趣,(除非不同的用户也为该文件分配了相同的类别)。

所以从上面的数据来看,我想只返回:

md5    CategoryPK
dffrf  7

我写的查询是:

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;

它似乎有效,但在我开始愤怒地使用它之前,如果我遗漏了什么或者有更好的方法,我会很感激第二个意见。

谢谢

【问题讨论】:

  • 这类问题可能比 StackOverflow 更适合 Code Review

标签: mysql select count distinct


【解决方案1】:

我不认为你的代码会给你你所追求的;如果一个文件被多个用户分配了多个类别,并且某些类别重叠,会发生什么情况?然后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" ?

【讨论】:

  • 好点 - 我刚刚检查了我的一张表,我发现使用此查询的另外 10 个文件!
【解决方案2】:

除了您没有在选择列表中获得似乎符合标准的类别之外,我看不出您所写内容有任何问题?我想你可以稍微简化一下,把这个类别拿出来:

SELECT  MD5, CategoryPK
FROM    Hash
GROUP BY MD5, CategoryPK
HAVING MIN(UserPK) <> MAX(UserPK)

或者,您可以考虑通过联接解决此问题,您可能需要运行一些测试并使用 EXPLAIN,但有时联接的性能优于 GROUP BY。无论如何,值得尝试看看您是否发现任何显着差异。

SELECT  DISTINCT t1.MDF, t2.CategoryPK
FROM    Hash T1
        INNER JOIN Hash T2
            ON T1.MD5 = T2.MD5
            AND T1.CategoryPK = T2.CategoryPK
            AND T1.UserPK < T2.UserPK

【讨论】:

  • +1 两个建议(尽管如果 OP 实际上意味着“两个以上不同的用户”,如他的文本中所述,他们显然不会给出预期的结果 -但根据他的尝试,我同意他的意思可能是至少两个..)。但是,我认为您关于 OP 所写内容没有任何问题的评论是错误的:请参阅我在回答开头的观察。
  • 是的 - 你是对的,我的意思是至少两个,我已经更正了这个问题。
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2019-05-31
  • 2017-12-24
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 2022-01-01
  • 2020-09-08
相关资源
最近更新 更多