mysql

2011-06-02 16 views
9

yinelenen kimlikleri seçerek çok basit sadece part_id olan masa ve part_type vardır:mysql

CREATE TABLE `temp` (
`part_id` INT NOT NULL , 
`part_type` CHAR(5) NOT NULL 

Bu bölüm id ve türlerinin uzun bir liste var. Bununla birlikte, bazı bölümler birden fazla türe sahiptir. Birden fazla türü olan parçaların kimliklerini nasıl alabilirim? Böyle bir şey çalışacak düşünüyordum:

SELECT * FROM temp WHERE part_in IN (SELECT count(part_id) as duplicates FROM temp WHERE 1 GROUP BY part_id) AND duplicates > 1

ancak bu açıkça sadece psuedocode ve başarısız olur. Yardım ettiğin için teşekkür ederim.

cevap

18
select part_id from temp 
group by part_id 
having count(*) > 1 

Bu, part_id öğelerini birden çok satıra verecektir. Daha sonra, birden fazla satıra sahip tüm parçalar için tüm part_id/part_type verilerini almak için örnek sorgunuzu beğenirsiniz.

select * from temp 
where part_id in (select part_id from temp 
        group by part_id 
        having count(*) > 1) 
order by part_id 
+0

işte bu! teşekkürler Fosco. "Sahip" hakkında düşünmedim. – julio

+0

ayrıca: Eğer sayma değeriyle de ilgileniyorsanız (hemen hemen db için ücretsiz), aşağıdakileri seçerek değiştirebilirsiniz: part_id, count (*) tempostan mycount olarak seç ... – thomas

4

HAVING bu soruya (kaç) ve sonraki soruya (türleri) size cevap verir, çünkü bunlar için GROUP_CONCAT seviyorum.

select part_type, count(*), group_concat(part_id) 
from temp 
group by 1 
having count(*) > 1; 
+0

OP sorgusundan farklı bir veri kümesi ama evet, bu bir sorgu ile bir satırda birleştirilmiş yinelenen bulmak için bir imp sorgusudur! – ThinkCode

+0

'GROUP BY 1' nedir? – powtac

+0

"grup by 1", ilk alana bir kısayol, yani bu durumda "group by part_type" ile aynıdır. –