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ä:

  1. Mitä tarkoittaa GROUP BY tekemättä mitään aggregaatiota?
  2. Mikä on sarakkeiden järjestyksen vaihtamisen merkitys sarakkeessa SELECT vs. sarakkeessa GROUP BY ?
  3. Mitä tarkoittaa kolmannen sarakkeen jättäminen pois kohdasta GROUP BY?
  4. 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

  • Kohta 2: Ei ole merkitys. GROUP BY ei ole merkitystä lainkaan (paitsi että vanhoissa versioissa se viittaa samaan ORDER BY. SELECT järjestyksellä on merkitystä vain tulosteen sarakkeiden järjestyksessä.

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *