Witam ponownie. Długo mnie nie było, ale zawsze mam w pamięci, że na tym forum mi pomogą.
Mam pewne zadanie. W jednej tabeli trzymam wykonane prace, w drugiej użytkowników. Problem polega na tym, że muszę zrobić ranking wyrobionych prac w konkretnym miesiącu, ale użytkownik może w danym miesiącu nie mieć wyrobionych godzin, wtedy powinien być w rankingu uwzględniony z zerowym czasem.
Baza uzytkownicy: id, imie, nazwisko
Baza godziny: id, user_id, data, czas, nazwa
Relacja 1 do wielu (opcjonalna, w programach modelacji baz danych zaznaczana jako kurza łapka z kółkiem) uzytkownicy.id i godziny.user_id
Mam zapytanie:
Kod:
SELECT b.id, b.imie, b.nazwisko, IFNULL(SUM(t.czas),0) AS wyrobione FROM uzytkownicy b
LEFT JOIN godziny t ON t.user_id = b.id
WHERE MONTH(t.dzien)=:miesiac:
GROUP BY b.id, b.imie, b.nazwisko
ORDER BY wyrobione DESC, b.nazwisko ASC
Problem jest taki, że to zapytanie nie daje mi użytkowników, którzy nic nie wyrobili. Gdy usunę warunek miesiąca, otrzymuję pełną listę użytkowników łącznie z tymi co mają 0, ale czas sumuje się ze wszystkich miesięcy.
Proszę o jaką poradę jak to poprawić, bo główkuję już nad tym od kilku godzin zmieniając warunki i zapytania, ale nic nie mogę osiągnąć.
Zależy mi na takim efekcie jak daje poniższe zapytanie, lecz bardziej optymalne (jak powyższy kod).
Kod:
SELECT imie, nazwisko, (SELECT IFNULL(SUM(czas),0) FROM godziny WHERE MONTH(dzien)=10 AND user_id=uzytkownicy.id) AS wyrobione FROM uzytkownicy WHERE ranga!=3
ORDER BY wyrobione DESC, nazwisko ASC LIMIT 100
Z poważaniem,
Imperator_Edi
Zakładki