Problem:
Du har dubbletter av rader i din tabell, där endast ID:n är unika. Hur hittar du dessa dubbletter?
Exempel:
Vår databas har en tabell som heter product
med data i följande kolumner:id
, name
och category
.
id | namn | kategori |
---|---|---|
1 | biff | kött |
2 | kaka | godis |
3 | d>biff | kött |
4 | fläsk | kött |
5 | kaka | godis |
6 | kaka | godis |
Låt oss hitta dubbletter av namn och produktkategorier. Du kan hitta dubbletter genom att gruppera rader med COUNT
aggregatfunktion och specificera en HAVING
sats för att filtrera rader.
Lösning:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Den här frågan returnerar endast dubbletter av poster – sådana som har samma produktnamn och kategori:
namn | kategori |
---|---|
biff | kött |
kaka | godis |
Det finns två dubbletter av produkter i vår tabell:biff från köttkategorin och tårta från godiskategorin. Den första produkten upprepas två gånger i tabellen, medan den andra visas tre gånger.
Diskussion:
För att välja dubbletter av värden måste du skapa grupper av rader med samma värden och sedan välja grupperna med fler än ett. Du kan uppnå det genom att använda GROUP BY
och en HAVING
klausul.
Det första steget är att skapa grupper av poster med samma värden i alla icke-ID-kolumner (i vårt exempel, name
och category
). Du gör detta med en GROUP BY
klausul. Efter GROUP BY
nyckelord, anger du namnen på de kolumner du vill använda för gruppering. Vi exkluderar id
kolumn eftersom det är vår tabells primärnyckel; per definition kommer varje rad att ha ett annat värde under den kolumnen. Om vi skulle inkludera det, skulle vi inte kunna upptäcka dubbletter!
Vi vill hitta grupper med mer än en rad; sådana grupper måste innehålla en dubblett per definition, så länge vi har grupperat på rätt kolumner. För att göra detta använder vi en HAVING
klausul. Villkoret vi anger är att antalet element i gruppen—COUNT(id)
—måste vara större än ett:COUNT(id) > 1
. Kom ihåg att HAVING
låter dig filtrera grupper; WHERE
är för att filtrera enskilda rader.