Bir alanın sayısının birden fazla olduğu yeri seçin


100

Bunun gibi bir şey yapmak istiyorum:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

Bunu MySql'de nasıl başarabilirim?

Yanıtlar:


146

Toplam sonuç karşılaştırması için HAVING, not WHEREcümlesini kullanın .

Sorguyu yüz değerinde almak:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

İdeal olarak, cümlecikte GROUP BYuygun bir değerleme için tanımlanmış olmalıdır HAVING, ancak MySQL, GROUP BY ...

Bu, benzersiz bir kısıtlamaya hazırlık olarak someFieldmı? Görünüşe göre olmalı ...


11
Bir İhtiyaçları GROUP BY(bu biraz MySQL standart olmayan şey değilse) mutlaka?
Martin Smith

@Martin Smith: Sorguyu göründüğü gibi aldı; GROUP BY sorunu ele alındı ​​(gizli sütunlar özelliği dahil).
OMG Ponies

"Görünüşe göre ..." Bu konuda eğitime ihtiyacım var :)
Dave

Dolayısıyla bu, 2'den fazla boş olmayan someFielddeğer içeriyorsa tüm tabloyu veya yoksa boş bir sonuç kümesini döndürür .
Martin Smith

@Dave: Kötü verileri periyodik olarak kontrol etmeniz ve düzeltmeniz gereken bir konumda olsaydınız, ilk etapta durumun olmasını durdurmak istemez miydiniz? MySQL, dizin olarak benzersiz bir kısıtlama uygular - daha fazla bilgi için CREATE INDEX belgelerine bakın
OMG Ponies

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
Buradaki tek uyarı (en azından 5.1.46-topluluk MySQL Community Server'da (GPL)) "Her türetilmiş tablonun kendi takma adı olmalıdır", bu da sizi sql gibi gösterecek: SELECT username, numb from (Select username, (kullanıcı adı), GROUP BY kullanıcı adı müşterilerinden numb olarak) my_table WHERE numb> 3
D_K

14

Bunu kendi kendine katılma ile de yapabilirsiniz:

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk

12

Hadi bakalım:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc

4

Tek yön

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)

1

OMG Ponies'in belirttiği gibi, sahip olmak, peşinde olduğunuz şeydir. Ancak, bir özet yerine ayrı satırlar elde edeceğinizi umuyorsanız ("sahip olmak" bir özet oluşturur) - bu tek bir ifadede yapılamaz. Bu durumda iki ifade kullanmalısınız.


1
Tam olarak doğru değil - HAVING'in kullandığı şeyi değiştirmek için GROUP BY kullanın.
OMG Ponies

1

Sql'deki iki tablo arasında Group By üzerine bir örnek veriyorum:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

Benim için, boş sonuç döndürerek bir gruba sahip olmamak. Sanırım sahip olma ifadesi için bir gruba sahip olmak oldukça önemli


-2

Ayrıca "pk" nin anahtar alan olması gerektiğinden de bahsedilmelidir. Kendi kendine katılma

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

Yazan Bill Karwin size yinelenen tüm kayıtları verir ki bu da istediğim şeydi. Bazılarının ikiden fazla olması nedeniyle, aynı kaydı birden fazla kez alabilirsiniz. Anahtar alanları gizleyerek aynı kayıtlardan kurtulmak için hepsini aynı alanlara sahip başka bir tabloya yazdım. denedim

SELECT * FROM db.table HAVING COUNT(someField) > 1

önce yukarıda. Ondan döndürülen veriler, kopyalardan yalnızca birini verir, bunun size verdiğinin 1 / 2'sinden daha azıdır, ancak istediğiniz tek şey buysa sayı iyidir.


3
Bu gerçekten bir cevap değil.
anon582847382
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.