2012-05-18 4 views
7

誰かが私のSQLクエリを検証できるのであれば、本当にありがたいです。以下のデータセットについてMysql 1つの列に同じ値を持ち、別の列で異なる行を選択してください

MD5  UserPK  CategoryPK  
ADCDE 1   7 
ADCDE 1   4 
ADCDE 1   7 
dffrf 1   7 
dffrf 2   7 
dffrf 2   6 
dffrf 1   1 

私は2つの以上の行が同一のMD5値を、同じCatgegoryPK及び二つ以上の異なるUserPK値で存在MD5とCategoryPKを選択したいと思います。

つまり、2人以上の異なるユーザー(UserPK)が同じカテゴリ(UserPK)を同じファイル(Md5)に割り当てたすべてのレコードのMD5とcategoryPKを知りたいと思います。同じユーザーがそのカテゴリに複数回割り当てたレコードには興味がありません(異なるユーザーが同じカテゴリをそのファイルに割り当てていない限り)。

したがって、上記のデータから、私は返されるしたいと思います:それは動作するようです

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; 

が、私は使用を開始する前に:私が書いたクエリがある

md5 CategoryPK 
dffrf 7 

それは怒っている、私は何かを逃した場合やそれを行うより良い方法がある場合には、二番目の意見に感謝します。

おかげ

+3

質問のこの種は、StackOverflowのより[コードレビュー](http://codereview.stackexchange.com)のためのより適切な場合があります。 – eggyal

答えて

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" ? 
+0

良い点 - 私は自分のテーブルの1つをチェックしただけで、このクエリを使ってさらに10個のファイルが見つかりました! – user1395659

1

私はあなたから離れて書かれたものに問題が基準にあるように見えるあなたの選択リストでカテゴリを取得されていません見ることができませんか?あなたは、あなたが、EXPLAINいくつかのテストを実行し、使用する必要があり参加してこれを解決を見て可能性があり、また

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

時には行うよりも優れ加入:私はあなたが少しそれを簡素化してカテゴリを得ることができると思います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 
+0

+両方の提案の+1(実際OPが実際に* 2人以上の異なるユーザー*を意味していたとしても、明らかに望ましい結果を得られませんが、彼の試みに基づいて、少なくとも2つ.. *)。しかし、私はOPが書いたことに何の問題もないというあなたのコメントは間違っていると思います:私の答えの始めに私の観察を見てください。 – eggyal

+0

はい - あなたは正しいです、私は少なくとも2つを意味し、私は質問を修正しました。 – user1395659