2012-05-18 12 views
7

Birisi SQL sorgumu doğrulayabilirse çok memnun olurum. Aşağıdaki veri kümesi içinMysql Bir sütunda aynı değerdeki satırları seçin ve başka bir farklı

:

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

iki veya daha fazla satır aynı MD5 değerleri özdeş CatgegoryPK ve iki veya daha fazla FARKLI UserPK değerleriyle var MD5 ve CategoryPK seçmek istiyorum. Başka bir deyişle, iki veya daha fazla farklı kullanıcının (UserPK) aynı dosyaya (UserPK) aynı dosyaya (Md5) atanmış olduğu tüm kayıtların MD5 ve categoryPK değerlerini bilmek isterim. Aynı kullanıcının kategoriyi birden çok kez atadığı kayıtlarla ilgilenmiyorum (farklı bir kullanıcı aynı dosyaya o dosyaya atanmamışsa). Yukarıdaki verilerden Yani

, sadece iade edilecek istiyorum:

md5 CategoryPK 
dffrf 7 

Yazdığım sorgusu:

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; 

iş gibi görünüyor, ama başlamadan önce kullanma öfkeyle, bir şeyleri kaçırdığımda veya bunu yapmanın daha iyi bir yolu varsa, ikinci bir düşünceyi takdir ediyorum.

Teşekkür

+3

Bu tür StackOverflow'daki daha [Kod Review] (http://codereview.stackexchange.com) için daha uygun olabilir. Her iki öneri için de – eggyal

cevap

11

Kodunuzun size sonra ne vereceğini düşünmüyorum; Bir dosya birden çok kullanıcı tarafından birden fazla kategoriye atandığında, bazı kategoriler çakıştığında ne olur? Sonra cntcat != 1, böylece dosya gerçekten birden çok kullanıcı tarafından aynı şekilde kategorize edilmiş olsa bile HAVING yan tümce eşleşmez.

onun yerine bir iç birleşim kullanırsınız: Sorunun

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

İyi nokta - Tablolarımdan birini kontrol ettim ve bu sorguyu kullanarak 10 dosya daha buldum! – user1395659

1

Sana kriterlere olduğu anlaşılıyor sizin Seçim listesinde kategoriyi almıyor sizi ayrı yazdıklarını herhangi bir sorun göremiyorum? sen, sen, AÇIKLAYINIZ birkaç test ve kullanımı gerekebilir bir katılmak ile bu çözümü bakabilir, Alternatif

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

ama bazen gerçekleştirmek daha iyi katılır: Sana hafifçe basitleştirmek ve dışarı kategorisini alabilir düşünüyorum GROUP BY. Önemli bir fark görüp görmediğinizi görmek için yine de denemeye değer.

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 (her ne kadar OP aslında metinde açıklandığı gibi * ikiden fazla farklı kullanıcı *) anlamına gelse de, kesin olarak istenen sonucu vermeyeceklerdir - ama onun denemesine dayanarak muhtemelen onun kastettiğine katılıyorum * en az iki..*). Ancak, yazdığınız yorumların OP'nin yazdığı hata ile ilgili herhangi bir sorun olmadığını düşünüyorum: cevabımın başlangıcında gözlemime bakın. – eggyal

+0

Evet - haklısınız, en az iki anlama geldim ve sorunu düzelttim. – user1395659