Wybierz, gdzie liczba jednego pola jest większa niż jeden


100

Chcę zrobić coś takiego:

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

Jak mogę to osiągnąć w MySql?

Odpowiedzi:


146

Użyj klauzuli HAVINGnot WHERE, aby porównać wyniki zagregowane.

Przyjmując zapytanie za dobrą monetę:

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

Najlepiej byłoby, gdyby GROUP BYw HAVINGklauzuli zdefiniowano odpowiednią wycenę , ale MySQL zezwala na ukryte kolumny z GROUP BY ...

Czy jest to przygotowanie na wyjątkowe ograniczenie someField? Wygląda na to, że powinno być ...


11
Potrzebuje na GROUP BYpewno (chyba że jest to jakaś niestandardowa rzecz MySQL)?
Martin Smith

@Martin Smith: Przyjęto zapytanie na wartość nominalną; rozwiązano problem GROUP BY (w tym funkcja ukrytych kolumn).
Kucyki OMG

„Wygląda na to, że powinno być…” Dlaczego? Potrzebuję edukacji w tym zakresie :)
Dave

Więc to zwróci całą tabelę, jeśli zawiera więcej niż 2 someFieldwartości inne niż null lub pusty zestaw wyników, jeśli nie zawiera.
Martin Smith

@Dave: Gdybyś był w sytuacji, w której musiałbyś okresowo sprawdzać i poprawiać złe dane, czy nie chciałbyś przede wszystkim powstrzymać tej sytuacji? MySQL implementuje unikalne ograniczenie jako indeks - więcej informacji można znaleźć w dokumentacji CREATE INDEX
OMG Kucyki

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

3
jedynym zastrzeżeniem (przynajmniej w wersji 5.1.46-community MySQL Community Server (GPL)) jest to, że „Każda tabela pochodna musi mieć swój własny alias”, co spowoduje, że będziesz wyglądać następująco: SELECT nazwa użytkownika, numb z (Wybierz nazwę użytkownika, count (nazwa użytkownika) as numb od klientów GROUP BY username) as my_table WHERE numb> 3
D_K

14

Możesz to również zrobić za pomocą samodzielnego dołączenia:

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

11

Proszę bardzo:

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

4

Jednokierunkowa

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

1

Jak stwierdził OMG Kucyki, klauzula posiadania jest tym, czego szukasz. Jeśli jednak liczyłeś na to, że zamiast podsumowania otrzymasz oddzielne wiersze („posiadanie” tworzy podsumowanie) - nie można tego zrobić w pojedynczej instrukcji. W takim przypadku musisz użyć dwóch instrukcji.


1
Nie do końca prawda - użyj GROUP BY, aby manipulować tym, czego używa POSIADAJĄCY.
OMG Kucyki

1

Podaję przykład na Group By między dwoma tabelami w Sql:

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

Dla mnie opcja Brak grupy po prostu zwróciła pusty wynik. Więc myślę, że posiadanie grupy przy oświadczeniu jest bardzo ważne


-2

Należy również wspomnieć, że „pk” powinno być polem kluczowym. Samozłączenie

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

Bill Karwin dał wam wszystkie rekordy, które są duplikatami, o co mi chodziło. Ponieważ niektóre mają więcej niż dwa, możesz uzyskać ten sam rekord więcej niż raz. Napisałem wszystko do innej tabeli z tymi samymi polami, aby pozbyć się tych samych rekordów przez pomijanie pól kluczowych. próbowałem

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

powyżej pierwszy. Dane z niego zwrócone dają tylko jeden z duplikatów, mniej niż 1/2 tego, co daje, ale liczba jest dobra, jeśli to wszystko, czego chcesz.


3
To naprawdę nie jest odpowiedź.
anon582847382
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.