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?

stevebot
źródło

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ć ...

Kucyki OMG
źródło
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
dandy_sql
źródło
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
Bill Karwin
źródło
11

Proszę bardzo:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
Nalan Madheswaran
źródło
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)
Martin Smith
źródło
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.

Brent Arias
źródło
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


user4551254
źródło
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

Maham Khan
źródło
-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.

Jim Blanchard
źródło
3
To naprawdę nie jest odpowiedź.
anon582847382