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:

  1. Vad är meningen med att använda GROUP BY utan att göra någon aggregering?
  2. Vad är betydelsen av att byta kolumnordning i SELECT vs i GROUP BY ?
  3. Vad är meningen med att utelämna den tredje kolumnen från GROUP BY?
  4. Varför är DISTINCT används tillsammans med GROUP BY? Kör distinkt operation efter att alla grupperingar har gjorts på slutresultatet eller före?

Kommentarer

  • Punkt 2: Det finns ingen betydelse. GROUP BY spelar ingen roll (förutom att det i gamla versioner antydde samma ORDER BY. SELECT ordning är viktig endast i kolumnerna i utdata.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *