Jag såg följande MySQL-fråga som använder både DISTINCT och GROUP BY tillsammans:
SELECT DISTINCT user_id, post_id, post_content FROM some_table GROUP BY post_id, user_id HAVING post_content LIKE "%abc%";
Här är ett scenario att följa med frågan: Varje användare har ett unikt id, user_id
, och kan skapa flera inlägg som identifieras med ett unikt id, post_id
. Varje inlägg skulle innehålla lite text.
Jag tyckte att det här var förvirrande (efter att ha kommit från Oracle DBs) och hade följande frågor:
- Vad är meningen med att använda
GROUP BY
utan att göra någon aggregering? - Vad är betydelsen av att byta kolumnordning i
SELECT
vs iGROUP BY
? - Vad är meningen med att utelämna den tredje kolumnen från
GROUP BY
? - Varför är
DISTINCT
används tillsammans medGROUP BY
? Kör distinkt operation efter att alla grupperingar har gjorts på slutresultatet eller före?
Kommentarer
Svar
annons 1) Gamla mysql-databaser och när du inaktiverar ENDAST_FULL_GROUP_BY kan du göra den här frågan och om post_innehållet är lika kommer du att märka att mysql ger ett slumpmässigt, inte deterministiskt värde .
ad 2) inget som helst
ad 3) lat programmering och det uppstår ett fel när du aktiverar ONLY_FULL_GROUP_BY
annons 4) Nej, den visar alla post_innehåll som är anslutna till user_id, post_id liknar addind post_content till gruppen av
Som Strawberry redan sa denna fråga inte meningsfullt
Svar
Den galna förmågan att tillåta partiell grupp i äldre versioner av MyS QL, måste vara en av de bästa kandidaterna för mest orsakade förvirring inom IT-branschen.
Med tanke på tabellen:
CREATE TABLE t ( x int not null primary key , y int not null ); INSERT INTO t (x,y) VALUES (1,1),(1,2);
Uttalandet
SELECT x, y FROM t GROUP BY x
kan betyda (1,1) eller (1,2) och MySQL skulle slumpmässigt returnera en av dessa. DISTINCT spelar ingen roll i det här fallet, resultatet är fortfarande in-deterministiskt.
SQL92 krävde att alla kolumner i valklausulen (utom aggregerade kolumner och konstanter) är en del av GROUP BY-satsen. p>
SQL99 lossade begränsningen lite och tillät oss att utelämna kolumner från GROUP BY som är funktionellt beroende av de återstående kolumnerna. Dvs
CREATE TABLE t ( x int not null primary key , y int not null ); SELECT x, y FROM t GROUP by x
skulle vara giltigt eftersom y är f.d. av x
Förvånansvärt nog (för mig) är den senare versionen av MySQL bäst i klassen när det gäller att implementera SQL99-versionen. Jag har inte kollat det nyligen, men när jag gjorde MySQL hanterade jag ganska komplicerade scenarier, där PostgreSQL bara hanterade triviella.
Att svara på dina frågor
1)
SELECT x, y FROM t GROUP BY x, y
betyder att kombinationen av x, y är en grupp. I alla möjliga situationer kan jag tänka mig att detta är detsamma som:
SELECT DISTINCT x, y FROM t
Eftersom de utvärderas logiskt vid olika tidpunkter kan det finnas något hörnfall där de faktiskt skulle skilja sig (jag kan dock inte tänka på en)
2) Ingen , i detta avseende är de en uppsättning kolumner, så det finns ingen ordning
3) Se ovan.
4) Den logiska ordningen för utvärdering av en SQL-fråga är:
FROM, JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY FETCH FIRST
så GROUP BY ska utvärderas innan DISTINCT. Jag kan inte tänka mig en situation där detta skulle betyda.
I din fråga Jag misstänker att någon fick förvirrande resultat och försökte få ett annat resultat med hjälp av DISTINCT. De hade förmodligen tur (eller otur) för att få det resultat de förväntat, så DISTINCT stannade. Buggen finns fortfarande där dock
GROUP BY
spelar ingen roll (förutom att det i gamla versioner antydde sammaORDER BY
.SELECT
ordning är viktig endast i kolumnerna i utdata.