Näin seuraavan MySQL-kyselyn, joka käyttää sekä DISTINCT: ää että GROUP BY: tä yhdessä:
SELECT DISTINCT user_id, post_id, post_content FROM some_table GROUP BY post_id, user_id HAVING post_content LIKE "%abc%";
Tässä on kyselyn mukana seuraava skenaario: Jokaisella käyttäjällä on yksilöllinen tunnus, user_id
, ja hän voi luoda useita viestejä, jotka tunnistetaan yksilöllisellä tunnuksella, post_id
. Jokainen viesti sisältäisi tekstiä.
Minusta tämä oli hämmentävää (kun olen tullut Oracle-DB: stä) ja minulla oli alla olevia kysymyksiä:
- Mitä tarkoittaa
GROUP BY
tekemättä mitään aggregaatiota? - Mikä on sarakkeiden järjestyksen vaihtamisen merkitys sarakkeessa
SELECT
vs. sarakkeessaGROUP BY
? - Mitä tarkoittaa kolmannen sarakkeen jättäminen pois kohdasta
GROUP BY
? - Miksi
DISTINCT
käytetään yhdessäGROUP BY
kanssa? Suoritetaanko erilliset toiminnot sen jälkeen, kun kaikki ryhmittelyt on tehty lopulliseen tulokseen tai ennen?
Kommentit
vastaus
ad 1) Vanhat mysql-tietokannat ja kun poistat ONLY_FULL_GROUP_BY -ominaisuuden käytöstä, voit tehdä tämän kyselyn ja jos kaikki post_content ovat yhtä suuret, huomaat, että mysql tuottaa satunnaisen, ei deterministisen arvon takaisin .
ad 2) ei mitään mitä ikinä
ad 3) laiska ohjelmointi ja se tapahtuu virhe, kun otat käyttöön ONLY_FULL_GROUP_BY
mainos 4) Ei, se näyttää kaikki post_content, jotka on yhdistetty user_id, post_id, samanlainen kuin addind post_content ryhmään.
Kuten Strawberry sanoi jo, että tämä kysely ei t mitään järkeä
Vastaa
Hullu kyky sallia osittainen ryhmittely MyS: n vanhemmissa versioissa QL: n on oltava yksi tärkeimmistä haastajista eniten sekaannusta kohtaan it-alalla.
Annettu taulukko:
CREATE TABLE t ( x int not null primary key , y int not null ); INSERT INTO t (x,y) VALUES (1,1),(1,2);
Lausunto
SELECT x, y FROM t GROUP BY x
voi tarkoittaa (1,1) tai (1,2) ja MySQL palauttaisi satunnaisesti yhden näistä. DISTINCT: llä ei ole merkitystä tässä tapauksessa, tulos on edelleen in-deterministinen.
SQL92 vaati, että kaikki select-lauseen sarakkeet (lukuun ottamatta koottuja sarakkeita ja vakioita) ovat osa GROUP BY -lauseketta.
SQL99 löysi tämän rajoituksen hieman ja antoi meille mahdollisuuden jättää pois GROUP BY -sarakkeet, jotka ovat toiminnallisesti riippuvaisia muista sarakkeista. Eli
CREATE TABLE t ( x int not null primary key , y int not null ); SELECT x, y FROM t GROUP by x
olisi kelvollinen, koska y on fd. x: stä
Yllättävän kyllä (minulle) MySQL: n uudempi versio on luokkansa paras SQL99-version käyttöönotossa. En ole tarkistanut sitä viime aikoina, mutta kun tein, MySQL käsitteli hyvin monimutkaisia skenaarioita, joissa PostgreSQL käsitteli vain vähäpätöisiä.
Vastaamaan kysymyksiisi
1)
SELECT x, y FROM t GROUP BY x, y
tarkoittaa, että x: n, y: n yhdistelmä on ryhmä. Kaikissa mahdollisissa tilanteissa voin ajatella, että tämä on sama kuin:
SELECT DISTINCT x, y FROM t
Koska ne arvioidaan loogisesti eri aikoina, saattaa olla joitain kulmatapauksia, joissa ne todella eroavat (en kuitenkaan voi ajatella yhtä)
2) Ei mitään , tässä suhteessa ne ovat sarakkeita, joten järjestystä ei ole.
3) Katso yllä.
4) SQL-kyselyn arvioinnin looginen järjestys on:
FROM, JOIN WHERE GROUP BY HAVING SELECT DISTINCT ORDER BY FETCH FIRST
joten GROUP BY on tarkoitus arvioida ennen DISTINCT. En voi ajatella tilannetta, jossa sillä olisi merkitystä.
Kyselyssäsi Epäilen, että joku sai hämmentäviä tuloksia ja yritti saada toisen tuloksen käyttämällä DISTINCT. He todennäköisesti onnistuivat (tai epäonnistuivat) saadakseen tuloksen odotettavissa, joten DISTINCT pysyi. Virhe on edelleen olemassa
GROUP BY
ei ole merkitystä lainkaan (paitsi että vanhoissa versioissa se viittaa samaanORDER BY
.SELECT
järjestyksellä on merkitystä vain tulosteen sarakkeiden järjestyksessä.