ugrás a tartalomhoz

Rendezés Group by-on belül

Anonymous · 2005. Jan. 4. (K), 18.06
Ü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?
 
1

Milyen adatbázis?

Bártházi András · 2005. Jan. 4. (K), 18.23
Milyen adatbázismotort használsz? Erre egy "subselect" lehet alkalmas, kivéve, ha régebbi MySQL-ed van. Ott össze lehet fűzni a rendezés szerinti értéket (azaz ami szerint a MAX-ot vennéd) és a azt az értéket, amire kiváncsi vagy (MAX(concatenate(gallery_id,'_',gallery_name))). Nem túl szép, nem túl hatékony, de működik.

-boogie-
2

Külön kell az azonosító

Anonymous · 2005. Jan. 4. (K), 18.31
MySQL 4.0.18 a jelenlegi verzió.

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.
3

MySQL 4.1

Bártházi András · 2005. Jan. 4. (K), 18.39
A subselect a MySQL 4.1-től érhető el. Az előző megoldásból még stringműveletekkel ki lehet nyerni az id-t. A MySQL doksiban benne van, csak lusta voltam neked megkeresni: The Rows Holding the Group-wise Maximum of a Certain Field

-boogie-
4

Having

sajt · 2005. Jan. 4. (K), 18.40
Having-et kell hasznalni

SELECT group_id, group_name, gallery_id, gallery_name
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id HAVING MAX(gallery_name)
5

Nincs eredmény

Anonymous · 2005. Jan. 4. (K), 19.26
SELECT group_id, group_name, COUNT(DISTINCT gallery_id) as countgal, COUNT(DISTINCT picture_id) as countpic, picture_id, MAX(time) as maxtime
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.
7

Mi van?

sajt · 2005. Jan. 4. (K), 19.36
Mik ezek a count(distinct)-ek? Ha jol latom vannak galeria csoportok, galeriak, es kepek.
Ebbol mit akarsz megtudni?
10

count(distinct)

Anonymous · 2005. Jan. 4. (K), 19.49
A count(distinct)-ek arra jók, hogy kiírják nekem az adott group alá tartozó gallery-k és picture-k számát...
6

A példa kedvéért

Anonymous · 2005. Jan. 4. (K), 19.30
SELECT group_id, group_name, gallery_id, MAX(gallery_name)
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)?
8

Probald ki.

sajt · 2005. Jan. 4. (K), 19.37
Probald ki. Persye csak akkor, ha te ugyanaz az Anonymous vagy. (Egyebkent tenyleg ugy kell)
9

Nem megy

Anonymous · 2005. Jan. 4. (K), 19.47
Igen, ugyanaz vagyok, de majd rgisztrálom magam. :)

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...
11

Biztos (sot igen)

sajt · 2005. Jan. 4. (K), 19.55
A having az olyasmi mint a where, csak ott lehet csoportosito fuggvenzeket is megadni. Elvileg ha a gasynalsz ilyen fuggvenyt a selectben, akkor a tobbi resynek group by-ban kell lennie. De jo lenne, ha pontosan leirnad, hogy mit is szeretnel, mert nem latom mar kristaly krisztan.
12

Kérdés újra

Anonymous · 2005. Jan. 4. (K), 20.13
Amire megoldást keresek hosszú, úgyhogy megkerestem azt a részt, ami az ügy szempontjából kényes, és arra írtam egy példát...

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:
group_id | group_name
---------------------
       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:
group_id | group_name | gallery_id | gallery_name
-------------------------------------------------
       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:
group_id | group_name | gallery_id | gallery_name
-------------------------------------------------
       1 |       elso |          2 | C-vel kezdodo
       2 |    masodik |          4 | tokmindegy mi


Ha MAX(gallery_name)-t használok:
group_id | group_name | gallery_id | MAX(gallery_name)
------------------------------------------------------
       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!
13

Ez esetleg?

sajt · 2005. Jan. 4. (K), 23.03

SELECT group_id, group_name, gallery_id, max(gallery_name)
FROM group LEFT JOIN gallery ON group_id=id_group
GROUP BY group_id, group_name, gallery_id
14

Nem jó

Anonymous · 2005. Jan. 5. (Sze), 13.50
Ez nem jó, mert kilistázza az összes galériát, olyan, mintha nem is használnék group by-t...
16

Bocs

sajt · 2005. Jan. 5. (Sze), 16.04
Akkor vedd ki belole a galery_id-t. Nem tudom. Gondolkozz egy kicsit, most mar kozel vagyunk!!!
17

Nem group by a megoldás

Anonymous · 2005. Jan. 5. (Sze), 18.38
A group by-okat végigpróbáltam, nekem elhiheted. :)
Bizonyára valami egyéb - és talán nem is bonyolult - kiegészítés kell bele.
15

Ez lenne az elmélet

Anonymous · 2005. Jan. 5. (Sze), 14.02
Megálmodtam, mit szeretnék. :)
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) :((((

SELECT group_id, group_name, gallery_id, gallery_name
  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
18

nem megy

Anonymous · 2005. Jan. 5. (Sze), 18.43
Kipróbáltam 4.1 alatt és hibaüzenetet adott:
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?
19

Kell egy AS

Anonymous · 2005. Jan. 5. (Sze), 19.46
A subselect-tel kreált táblát el kell nevezni valahogy
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... :)))