ugrás a tartalomhoz

MySQL: rendezés GROUP BY előtt

abicska · 2011. Júl. 1. (P), 15.12
Szevasztok!

Szeretnék kérni egy kis segítséget, mert elakadtam.
Adott egy képalbum. Szeretném kiválasztani a legjobb képeket felhasználónként csoportosítva, egy konkrétan megadott albumon belül.

A tábla - a kérdésben említett része - így néz ki:

useridalbumidrating
115
113
215
213
125
122


Ebből szeretnék egy ilyesmit:
SELECT * FROM table WHERE albumid = 1 ORDER BY rating DESC GROUP BY userid

useridalbumidrating
115
215


Attól, hogy *-ot kérek le és, hogy a GROUP és az ORDER fordítva van, kérlek Titeket, tekintsünk el.
Az érthetőség miatt írtam így.



Köszönöm a segítséget előre is!
 
1

HAVING

Poetro · 2011. Júl. 1. (P), 15.22
Ezt legegyszerűbben HAVING használatával lehet megoldani, ha jól emlékszem, vagy JOIN használatával. Ahol a JOIN-ben lekérdezed a maximális rating-et userenként, majd kiválasztod azokat az elemeket, amelyekre teljesül.
SELECT * FROM tabla LEFT JOIN 
  (SELECT MAX(rating) AS maxrating, userid FROM tabla AS t GROUP BY userid) 
  ON tabla.userid = t.userid AND tabla.rating = t.rating 
2

:(

abicska · 2011. Júl. 1. (P), 15.34
Ez így sajnos nem lett jó.
Picit át kellett alakítani, mert csak így fogadta el:
SELECT * FROM tabla AS t2 LEFT JOIN
(SELECT MAX(rating) AS rating, userid FROM tabla GROUP BY userid) AS t
ON t2.userid = t.userid AND t2.rating = t.rating
Sajnos listázta az összes sort.
3

talán így

Poetro · 2011. Júl. 1. (P), 15.49
SELECT * FROM tabla AS t2 LEFT JOIN  
(SELECT MAX(rating) AS rating, userid FROM tabla GROUP BY userid) AS t  
ON t2.userid = t.userid WHERE t2.rating = t.rating
4

:(

abicska · 2011. Júl. 1. (P), 16.22
Ez így alakul, de többször szerepel minden felhasználó.

Írtam egy ilyet:
SELECT MAX(t1.rating) AS rate FROM tabla AS t1
LEFT JOIN tabla AS t2 ON rate = t2.rating
WHERE t1.albumid = 2 GROUP BY t1.userid
Azért, mert a
SELECT MAX(t1.rating) AS rate FROM tabla GROUP BY userid
tökéletesen visszaadta, hogy felhasználónként mennyi a legjobb értékelés. Ehhez ha hozzá lehetne LEFT JOIN-nal kötni mégegyszer ugyanazt a táblát a kiszámolt rate és a csatolt rating alapján, akkor rendben lenne, mert az már mindegy, hogy konkrétan melyik 5-re értékelt elemről van szó.

Csak az a baj, hogy a MySQL nem ismeri a rate oszlopot a join-nál, illetve megint többször szerepelne mindenki, mert több ugyanolyanra értékelt elem lehet.
Vagyis megint kellene egy GROUP BY, de azt megint rendezni kéne rating szerint ... és akkor kezdődik minden előről.
5

kész

abicska · 2011. Júl. 1. (P), 16.39
Végülis sikerült megoldanom. Félig SQL lekérés, félig PHP.
A duplikátumokat PHP-val kiszedtem, és így rendben van.
Köszönöm a segítséget! :)