[mySql] - 2 zapytania w jedno

Odpowiedz Nowy wątek
2006-08-15 12:26
0

Cześć, mam taki problem. Otóż mam zapytanie, które zwraca: Tytuł piosenki, średnią głosów i ilość głosów. Wszystko z dwóch tabel: songs i grades.
Tabela grades wygląda tak:

ID
songID - id piosenki z tabeli songs
userID - id użytkownika
grade - ocena

Teraz chcę, żeby użytkownik mógł głosować tylko raz na daną piosenkę. I tu się pojawia problem, ponieważ jednocześnie chcę mieć wyświetlaną średnią głosów i ilość głosów oddaną na tą piosenkę.
Moje zapytanie wygląda tak:

SELECT s.ID as ID, s.title as title, s.mp3 as mp3, g.userID as UID, g.grade as grade, AVG(g.grade) AS srednia, 
           g.songID as GSID, g.userID as GUID, COUNT(g.grade) AS ilosc 
FROM songs s 
LEFT JOIN grades g on g.songID = s.ID AND g.userID = 2 
GROUP BY UID, grade, GSID, GUID, ID, title, mp3 
HAVING s.mp3 != '' 
ORDER BY s.id desc

Problem jest przez warunek w left join: AND g.userID = 2, ponieważ wtedy pobiera średnią i ilość tylko dla tego użytkownika, a nie dla wszystkich.
Próbowałem rozwiązać to poprzez zagnieżdżony select, a nawet unie, ale żaden sposób nawet nie poszedł.

Jak to zrobić?
Aha ten warunek : AND g.userID = 2 musi być obecny, ponieważ dzięki temu rozróżniam, czy użytkownik oddał już głos na daną piosenkę.

Muszę to zrobić jednym zapytaniem

Pozostało 580 znaków

2006-09-03 15:54
0

Wystarczy drugi raz podpiąć tą samą tabelę i już wyliczy prawidłowo

    SELECT 
        s.ID as ID
        ,s.title as title
        ,s.mp3 as mp3
        ,g.userID as UID
        ,g.grade as grade
        ,AVG(g2.grade) AS srednia
        ,g.songID as GSID
        ,g.userID as GUID
        ,COUNT(g2.grade) AS ilosc 
    FROM 
        songs s 
    LEFT JOIN 
        grades g 
    on 
        g.songID = s.ID 
    AND 
        g.userID = 2 
    LEFT JOIN
        grades g2
    ON
        s.id = g2.songid
    GROUP BY 
        UID
        ,grade
        ,GSID
        ,GUID
        ,ID
        ,title
        ,mp3 
    HAVING 
        s.mp3 != '' 
    ORDER BY 
        s.id desc

Daj człowiekowi cracka a jutro znowu bedzie głodny. Naucz go crackować a już nigdy nie będzie głodny.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0