MySQL-ben pontosan mi a különbség a két megoldás között?
Találtam ezt az oldalt
Azon túl, hogy a az eredmény halmazt egy sorban adja vissza a group_concat, míg a group by külön sorokba, van-e lényeges különbség a két megoldás között:
SELECT
GROUP_CONCAT(country)
FROM
customers;
SELECT
country
FROM
customers group by(customerNumber);
Ezen túl van haszna a group_concat-nak
Kijelölés, jobb gomb, Google. Ezt a munkát most elvégeztem helyetted, pl.: [link]
Amit a neve is mutatja, a group_concat() konkatenál. A group by nem. Azt csak akkor tudod használni, ha egy aggregált eredmény van a select után írva. Ezenkívül nyilván egész más a két példa, amit írtál, hiszen az egyikben country, a másikban customerNumber szerint csoportosítasz.
Az elsőben nem csoportosít semmi szerint.
A group_concat egy agregátor függvény, mint a min, max, avg, stb. Azaz csoportokból képez egy értéket. Egész pontosan az argumentumában lévő kifejezést alkalamzza a csoport minden rekordjára és ezeket konkatenálja össze (alapértelmezetten egy vesszővel elválasztva).
Dokumentáció:
(Ha nem csoportosítasz, mint az első példában, akkor az egész eredmény halmaz egy csoportként működik.)
Elméletben csoportosítás esetén csak a csoportosító mezőket és az agregátor függvényeket szabad használni. Ezt megsérti a második példád. De a MySQL van olyan rugalmas, hogy nem küld el a francba miatta. Cserébe viszont (ha jól tudom) nem definiált, hogy mi lesz az eredménye.
Értsd, hogy mit jelent a 2. példád: csoportosítsd a rekordokat customerNumber szerint és csoportonként adj EGY country értéket (MELYIKET?!)
A két példa így lenne HASONLÓ:
SELECT
GROUP_CONCAT(country)
FROM
customers;
SELECT
country
FROM
customers;
Ekkor az első összefűzné az X darab country-t vesszővel elválasztva 1 darab szöveggé (azaz 1 darab rekord az eredmény).
A második pedig vissza adná az X darab country-t (azaz X darab rekord az eredmény).
Vagy így lenne hasonló a két példa:
SELECT
GROUP_CONCAT(country)
FROM
customers
GROUP BY
customerNumber;
SELECT
country
FROM
customers
GROUP BY
customerNumber;
Ekkor az első összefűzné Y darab csoport X1, X2, ... darab county-ját 1-1 szöveggé (azaz Y darab rekord lenne az eredmény).
A második pedig az Y darab csoportból kivenne EGY-EGY country-t (MELYIKET?! ugye) - itt is Y darab rekord az eredmény, de csak 1-1 country!
Ja, és a "haszna":
Attól függ, mi a feladat.
Tegyük fel, hogy vannak országnevek és kontinens nevek.
SELECT
kontinens, GROUP_CONCAT(orszag)
FROM
orszagok
GROUP BY
kontinens;
Ez kontinensenként összefűzné az országok neveit, és valami ilyesmi lenne az eredmény:
Európa|Magyarország,Ausztria,Németország,...
Ázsia|Kína,Japán,Oroszország,...
Afrika|Egyiptom,Algéria,...
...
Megjegyzés: a dokumentációban benne van, hogyan lehet megadni az elválasztó értékét. Tehát nem muszáj a vesszővel használni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!