2016-03-28 17 views
2

Şimdi birkaç gün boyunca benim sorunum için bir çözüm arıyorum. Denediğim herhangi bir şey istenmeyen sonuçlar verir.Tüm sütunlarda çoğaltmaları olan birden çok satırı karşılaştırmak ve farklı bir sütunu görüntülemek SQL

Temel olarak, ne yapmaya çalıştığımı, satırları aynı tablodan karşılaştırır.

Benim sorgu dönüşünü istiyorum ne
name | hobby 
------+------------ 
Bill | fishing  <- 1 
Bill | basketball <- 2 
Bill | tennis  <- 3 
Peter | soccer 
Peter | baseball 
Joe | tennis  <- 3 
Joe | basketball <- 2 
Peter | fishing 
Dave | tennis 
Joe | fishing  <- 1 
Dave | fishing 
Dave | basketball 
Dave | football 

, aynı hobilere sahip iki kişinin adlarını gösteren bir tablo ve onlar sahip hobilerinden miktarıdır: Şimdi, bunun söz konusu tablodur diyelim ortak. Aynı adı bir satırda iki kez göstermemelidir. Bu masada sorguyu yürütmek için olsaydı, sonuç şöyle olacaktır:

name1 | name2 | nr_of_hobbies 
--------+-----------+---------------- 
Bill | Joe  | 3 
Joe  | Bill | 3 

Ben bir karışımı bunların, katılır alt sorgular kullanarak sorgular her türlü denedim, ama sadece mümkün olmamıştır kafasına çivi çarptı. Özellikle, diğer sütunlardaki öğelerin aynı olduğu, bir sütundaki birden çok öğeyi karşılaştırma yolunu bulmakta zorlanıyorum. Herhangi bir yardım büyük takdir edecekti. Şimdiden teşekkürler!

cevap

2

bu deneyin:

SELECT t1.name, t2.name, 
     (SELECT COUNT(*) 
     FROM mytable AS t 
     WHERE t.name = t1.name) AS t1_count, 
     (SELECT COUNT(*) 
     FROM mytable AS t 
     WHERE t.name = t2.name) AS t2_count   
FROM mytable AS t1 
INNER JOIN mytable AS t2 ON t1.hobby = t2.hobby 
WHERE t1.name <> t2.name 
GROUP BY t1.name, t2.name 
HAVING COUNT(*) = t1_count AND COUNT(*) = t2_count 

Demo here

Eğer çiftleri istiyorsanız

select group_concat(name) as names, hobbies 
from (select name, group_concat(hobby order by hobby) as hobbies 
     from t 
     group by name 
    ) n 
group by hobbies 
having count(*) > 1; 

Sen join ile aynı şeyi yapabilirsiniz: Aynı sütunda isimlerini koyar

+0

Teşekkürler Giorgos. Bu tam olarak aradığım cevaptı! –

+0

@ 7z. . . . Bunun aradığınız cevap olduğunu göremiyorum. Belirttiğiniz cevabın üç sütun var - örneğin - ve bu dört var. –

+0

@GordonLinoff Evet, bu doğru, ama yapmak istediğim şeyin bu değil. Öncelikli olarak, bir sütunda birden çok değer için bir aramanın nasıl yapıldığını anlamak istedim, çünkü başka bir sütundaki değerler aynıdır. Cevabınız da yardımcı oldu, ama daha önce hiç grup_koncat kullanmamıştım ya da duymamıştım. Böylelikle, SQL'le elde edebileceklerim kadar ufkumu genişletmiş olman anlamında yardımcı oldu, ama Giorgos'un cevabı gibi şeyleri sezgisel hale getirmedi. Bu yüzden onun cevabını seçtim. –

3

MySQL'de, en kolay yol group_concat() kullanmaktır. Not:

select n1.name as name1, n2.name as name2 
from (select name, group_concat(hobby order by hobby) as hobbies 
     from t 
     group by name 
    ) n1 join 
    (select name, group_concat(hobby order by hobby) as hobbies 
     from t 
     group by name 
    ) n2 
    on n1.hobbies = n2.hobbies and n1.name <> n2.name; 
+1

Birleştirme koşulunda n1.name <> n2.name eklerim. – Shadow

+0

Çok teşekkürler! Kesinlikle bu yöntemi akılda tutacak. Diğer cevabı çözüm olarak seçtim çünkü öncelikle hangi alt sorguların birden fazla satırda arama yapmak zorunda kaldığını anlamak istedim. Buna rağmen, harika cevap. –

İlgili konular