Rendezés Group by-on belül
Üdv!
Azt szeretném megtudni, hogyan lehet egy group by csoportosításon belül megtudni a(z) utolsó/első/stb elemet. A group by mindig az első elem adatait jeleníti meg... A legnagyobbat pl. ki tudom kérni MAX() függvénnyel, de a MAX(ertek)-hez tartozó azonosítót már nem...
Pl:
group
-----
- group_id
- group_name
gallery
-------
- gallery_id
- id_group
- gallery_name
SELECT group_id, group_name, gallery_id, gallery_name
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id
Ez visszaadja a csoporthoz tartozó első galériát...
SELECT group_id, group_name, gallery_id, MAX(gallery_name)
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id
Ez visszaadja a csoporthoz tartozó "legnagyobb" galéria nevet, de a gallery_id nem az, ami a MAX(gallery_name)-hez tartozik. Ezt hogy lehetne megoldani?
■ Azt szeretném megtudni, hogyan lehet egy group by csoportosításon belül megtudni a(z) utolsó/első/stb elemet. A group by mindig az első elem adatait jeleníti meg... A legnagyobbat pl. ki tudom kérni MAX() függvénnyel, de a MAX(ertek)-hez tartozó azonosítót már nem...
Pl:
group
-----
- group_id
- group_name
gallery
-------
- gallery_id
- id_group
- gallery_name
SELECT group_id, group_name, gallery_id, gallery_name
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id
Ez visszaadja a csoporthoz tartozó első galériát...
SELECT group_id, group_name, gallery_id, MAX(gallery_name)
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id
Ez visszaadja a csoporthoz tartozó "legnagyobb" galéria nevet, de a gallery_id nem az, ami a MAX(gallery_name)-hez tartozik. Ezt hogy lehetne megoldani?
Milyen adatbázis?
MAX(concatenate(gallery_id,'_',gallery_name))
). Nem túl szép, nem túl hatékony, de működik.-boogie-
Külön kell az azonosító
A gallery_id külön kéne az eredményben, mert még aszerint kéne hozzáfűznöm értékeket...
Ez csak egy példa volt, amin keresztül érthetően el tudtam magyarázni, amiért szükségem van rá sokkal bonyolultabb.
Képzelj el egy fórumot, forum, topic, message táblákkal. Egy olyan listát kéne megjelenítenem, ami kiírja a fórum nevét, a hozzá tartozó topicok és hozzászólások számát, az utolsó hozzászólás dátumát, valamint - és itt jön a lényeg - az utolsó hozzászóló nevét... (ezt én úgy képzelem, hogy a MAX(time)-hoz tartozó sort kérem le a group by-ból)
Ez nagyjából meg is van, már csak annyi a lényeg, hogy a left join-nal kapcsolt táblák után ne egy "spontán" sort adjon vissza az utolsó tábla (vagyis ne az első értéket), hanem amit én keresek.
MySQL 4.1
-boogie-
Having
Nincs eredmény
FROM group LEFT JOIN gallery ON group_id=id_group LEFT JOIN picture ON gallery_id=id_gallery
GROUP BY group_id HAVING MAX(time)
Ez nem ad vissza semmit, viszont HAVING MAX(time) nélkül működik, csak a picture_id nem a MAX(time)-os sorból van.
Mi van?
Ebbol mit akarsz megtudni?
count(distinct)
A példa kedvéért
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id HAVING MAX(gallery_name)
Csak, hogy a példánál maradjak...
EZ SEM működik. :) Nem úgy kell, hogy HAVING gallery_name=MAX(gallery_name)?
Probald ki.
Nem megy
Nem megy, de olvastam egy ilyet: "Csak azon csoportok adatai jelennek meg (egy-egy sor erejéig) az outputon, amikre teljesül a HAVING feltétel." Ez igaz, vagy sem?
Eddig úgy néz ki, igaz: a csoportok még mindig az első útjukba eső gallery_id-t és gallery_name-t írják ki, és mivel a
"véletlenszerű" gallery_name sehol sem egyezik a MAX(gallery_name)-mel, így Empty set az eredmény...
Biztos (sot igen)
Kérdés újra
Tehát legyen két tábla:
1. group
-----
- group_id
- group_name
2. gallery
-------
- gallery_id
- id_group
- gallery_name
A group-ban vannak a csoportok, amik alá tartoznak a gallery-k. 1 group-hoz több gallery is tartozhat. (mint: fórumban témák - hozzászólások /1 téma több hozzászólás/)
Egy olyan lekérdezést szeretnék írni, ami a csoportokat írja ki, és mellettük a hozzájuk tartozó legutolsó gallery_name-t. (mint: fórumban témák listázása /téma, utolsó hozzászólás, utolsó név/)
Na most az utolsó gallery_name-t megkapom a MAX(gallery_name)-mel, de a mellette lévő gallery_id nem ahhoz a sorhoz tartozik, ahol a gallery_name megegyezik a MAX(gallery_name)-mel.
Pl:
---------------------
1 | elso
2 | masodik
gallery_id | id_group | gallery_name
------------------------------------
1 | 1 | A-val kezdodo
2 | 1 | C-vel kezdodo
3 | 1 | B-vel kezdodo
4 | 2 | tokmindegy mi
Lekérdezés:
SELECT group_id, group_name, gallery_id, gallery_name
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id
Eredmény:
-------------------------------------------------
1 | elso | 1 | A-val kezdodo
2 | masodik | 4 | tokmindegy mi
Amit szeretnék:
a group by-on belül olyan értékeket kapni, ahol mondjuk gallery_name a legnagyobb:
-------------------------------------------------
1 | elso | 2 | C-vel kezdodo
2 | masodik | 4 | tokmindegy mi
Ha MAX(gallery_name)-t használok:
------------------------------------------------------
1 | elso | 1 | C-vel kezdodo
2 | masodik | 4 | tokmindegy mi
Vagyis a MAX(gallery_name) és a gallery_id nincs összhangban...
Remélem a hosszúsága ellenére érthető a problémám. :)
És köszönöm az eddigi válaszokat!
Ez esetleg?
Nem jó
Bocs
Nem group by a megoldás
Bizonyára valami egyéb - és talán nem is bonyolult - kiegészítés kell bele.
Ez lenne az elmélet
Remélem ez érthető... A lekérdezés előbb rendezi a sorokat, és csak UTÁNA csoportosít.
Csakhogy nálam még nincs 4.1-es MySQL (jelenlegi verzió 4.0.18) :((((
FROM (SELECT group_id, group_name, gallery_id, gallery_name
FROM group LEFT JOIN gallery ON group_id=id_group
ORDER BY gallery_name DESC)
GROUP BY group_id
nem megy
ERROR 1248 (42000): Every derived table must have its own alias
Ennek mi is az értelme? (lefordítani még le tudom)
Ööö... lehetséges olyan megoldás, hogy előbb létrehozok egy (temp) táblát, benne az adatokkal, és onnan csoportosítok? Mert más megoldást egyenlőre nem látok. Megoldható/biztonságos/értelmes megoldás ez? És ha egyszerre többen kérik le az oldalt?
Kell egy AS
FROM (SELECT...) AS tabla
Azt hiszem ez a jó megoldás, kipróbáltam 4 tábla összefűzésével (csoport, galéria, képek, felhasználók), és egész jól működik. Most már csak várnom kell, mikor lesz kész a rendszergazda a MySQL frissítéssel... :)))