Jeg så følgende MySQL-forespørgsel, der bruger både DISTINCT og GROUP BY sammen:

SELECT DISTINCT user_id, post_id, post_content FROM some_table GROUP BY post_id, user_id HAVING post_content LIKE "%abc%"; 

Her er et scenarie, der følger med forespørgslen: Hver bruger har et unikt id, user_id, og kan oprette flere indlæg, der identificeres med et unikt id, post_id. Hvert indlæg indeholder tekst.

Jeg fandt dette forvirrende (efter at være kommet fra Oracle DBs) og havde nedenstående spørgsmål:

  1. Hvad er meningen med at bruge GROUP BY uden at foretage nogen sammenlægning?
  2. Hvad er betydningen af at skifte rækkefølgen af kolonner i SELECT vs i GROUP BY ?
  3. Hvad er meningen med at udelade den tredje kolonne fra GROUP BY?
  4. Hvorfor er DISTINCT brugt sammen med GROUP BY? Kører særskilt handling, efter at alle grupperinger er udført på det endelige resultat eller før?

Kommentarer

  • Punkt 2: Der er ingen betydning. GROUP BY betyder slet ikke noget (bortset fra at det i gamle versioner antydede det samme ORDER BY. SELECT rækkefølge betyder kun noget ved arrangementet af kolonner i output.

Svar

annonce 1) Gamle mysql-databaser, og når du deaktiverer KUN_FULL_GROUP_BY , kan du foretage denne forespørgsel, og hvis post_indholdet alle er lige, vil du bemærke, at mysql leverer en tilfældig ikke deterministisk værdi tilbage .

annonce 2) intet hvad så nogensinde

annonce 3) doven programmering, og der opstår en fejl, når du aktiverer ONLY_FULL_GROUP_BY

annonce 4) Nej, det viser alt post_indhold, der er forbundet til user_id, post_id svarende til addind post_content til gruppen af

Som Strawberry allerede sagde, er denne forespørgsel ikke giver mening

Svar

Den vanvittige evne til at tillade delvis gruppering i ældre versioner af MyS QL, skal være en af de bedste kandidater til mest forårsaget forvirring i it-branchen.

Givet tabellen:

CREATE TABLE t ( x int not null primary key , y int not null ); INSERT INTO t (x,y) VALUES (1,1),(1,2); 

Erklæringen

SELECT x, y FROM t GROUP BY x 

kunne betyde (1,1) eller (1,2), og MySQL vil tilfældigt returnere en af disse. DISTINCT betyder ikke noget i dette tilfælde, resultatet er stadig in-deterministisk.

SQL92 krævede, at alle kolonner i selektionssætningen (undtagen aggregerede kolonner og konstanter) er en del af GROUP BY-udtrykket.

SQL99 løsnede denne begrænsning en smule og tillod os at udelade kolonner fra GROUP BY, der er funktionelt afhængige af de resterende kolonner. Det vil sige

CREATE TABLE t ( x int not null primary key , y int not null ); SELECT x, y FROM t GROUP by x 

ville være gyldig, da y er f.d. af x

Overraskende nok (for mig) er den senere version af MySQL bedst i klassen, når det gælder implementering af SQL99-versionen. Jeg har ikke tjekket det for nylig, men da jeg gjorde MySQL, håndterede jeg temmelig komplicerede scenarier godt, hvor PostgreSQL kun håndterede trivielle.

At besvare dine spørgsmål

1)

SELECT x, y FROM t GROUP BY x, y 

betyder, at kombinationen af x, y er en gruppe. I alle mulige situationer kan jeg tænke på, at dette er det samme som:

SELECT DISTINCT x, y FROM t 

Da de logisk evalueres på forskellige tidspunkter, kan der være noget hjørnesag, hvor de faktisk ville være forskellige (jeg kan dog ikke tænke på en)

2) Ingen , i denne henseende er de et sæt kolonner, så der er ingen rækkefølge

3) Se ovenfor.

4) Den logiske rækkefølge for evaluering af en SQL-forespørgsel er:

FROM, JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY FETCH FIRST 

så GROUP BY skal evalueres inden DISTINCT. Jeg kan ikke tænke på en situation, hvor dette ville have noget at gøre.

I din forespørgsel Jeg formoder, at nogen fik forvirrende resultater og forsøgte at få et andet resultat ved hjælp af DISTINCT. De var sandsynligvis heldige (eller uheldige) for at få det resultat, de forventet, så DISTINCT blev. Fejlen er der dog dog

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *