Problem:
Twoja tabela zawiera zduplikowane wiersze, a unikalne są tylko identyfikatory. Jak znaleźć te zduplikowane wpisy?
Przykład:
Nasza baza danych zawiera tabelę o nazwie product z danymi w następujących kolumnach:id , name i category .
| id | imię | kategoria |
|---|---|---|
| 1 | stek | mięso |
| 2 | ciasto | słodycze |
| 3 | d>stek | mięso |
| 4 | wieprzowina | mięso |
| 5 | ciasto | słodycze |
| 6 | ciasto | słodycze |
Znajdźmy zduplikowane nazwy i kategorie produktów. Duplikaty można znaleźć, grupując wiersze za pomocą COUNT funkcja agregująca i określenie HAVING klauzula, za pomocą której filtrować wiersze.
Rozwiązanie:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
To zapytanie zwraca tylko zduplikowane rekordy — te, które mają tę samą nazwę produktu i kategorię:
| nazwa | kategoria |
|---|---|
| stek | mięso |
| ciasto | słodycze |
W naszej tabeli znajdują się dwa duplikaty produktów:stek z kategorii mięso i ciasto z kategorii słodycze. Pierwszy produkt jest powtarzany w tabeli dwa razy, a drugi pojawia się trzy razy.
Dyskusja:
Aby wybrać zduplikowane wartości, musisz utworzyć grupy wierszy o tych samych wartościach, a następnie wybrać grupy o liczbie większej niż jeden. Możesz to osiągnąć, używając GROUP BY i HAVING klauzula.
Pierwszym krokiem jest utworzenie grup rekordów z tymi samymi wartościami we wszystkich kolumnach niebędących identyfikatorami (w naszym przykładzie name i category ). Robisz to za pomocą GROUP BY klauzula. Po GROUP BY słowo kluczowe, umieszczasz nazwy kolumn, których chcesz użyć do grupowania. Wykluczamy id kolumna, ponieważ jest to klucz podstawowy naszej tabeli; z definicji każdy wiersz będzie miał inną wartość w tej kolumnie. Gdybyśmy go uwzględnili, nie bylibyśmy w stanie wykryć duplikatów!
Chcemy znaleźć grupy z więcej niż jednym wierszem; takie grupy muszą z definicji zawierać duplikat, o ile pogrupowaliśmy według właściwych kolumn. Aby to zrobić, używamy HAVING klauzula. Warunkiem, który określamy, jest liczba elementów w grupie — COUNT(id) — musi być większe niż jeden:COUNT(id) > 1 . Pamiętaj, że HAVING umożliwia filtrowanie grup; WHERE służy do filtrowania poszczególnych wierszy.