Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]SELECT, UNION i SUM
Forum PHP.pl > Forum > Przedszkole
aros
Staram się skonstruować zapytanie SQL, jeśli się da, za jednym razem. Nie bardzo mam koncepcję. Problem jest następujący:

Mam dwie tabele: mecze i users, w niej mecze zawodników (pola gospodarz, gość - po id usera) i wyniki punktowe (pola ra1 i ra2) w danych datach oraz nicki zawodników.
Chciałbym wyciągnąć zapytaniem posortowaną tablicę użytkowników, którzy wybranego przeze mnie dnia grali choć jeden mecz, sortując ją względem największej sumy zdobytych punktów danego dnia (a więc suma: gospodarz z pola ra1 i gosc z pola ra2)

Koncepcja na zapytania to z grubsza złożenie tablicy graczy (bez powtórzeń), którzy danego (wybranego) dnia grali przynajmniej jeden mecz, choćby tak:

  1. SELECT gospodarz AS id FROM mecze WHERE dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59"
  2. UNION
  3. SELECT gosc AS id FROM mecze WHERE dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59"


Sumę zdobytych punktów danego dnia złapię dodając wynik dwóch zapytań:
  1. SELECT SUM( ra1 ) FROM mecze WHERE gospodarz = id AND dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59"
  2. SELECT SUM( ra2 ) FROM mecze WHERE gosc = id AND dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59"


Ma ktoś ochotę pomóc, jak to złożyć w jedno zapytanie w MYSQL, które wypluje mi TOP graczy dnia?

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Jakby ktoś potrzebował. Złożyłem i działa:

  1. SELECT id, imie,
  2. (
  3. (SELECT COALESCE(SUM( ra1 ),0) FROM mecze WHERE dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59" AND gospodarz = id)
  4. +
  5. (SELECT COALESCE(SUM( ra2 ),0) FROM mecze WHERE dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59" AND gosc = id)
  6. ) AS suma
  7.  
  8. FROM
  9.  
  10. (
  11. SELECT gospodarz AS id FROM mecze WHERE dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59"
  12. UNION
  13. SELECT gosc AS id FROM mecze WHERE dzien >= "2013-01-01 00:00:00" AND dzien <= "2013-01-01 23:59:59"
  14. ) AS id,
  15.  
  16. users WHERE id = user
  17.  
  18. ORDER BY suma DESC


Chyba można zamknąć smile.gif
mmmmmmm
I ile to się wykonuje dla jakiej ilości rekordów... Toż to jest "bazozabijacz"...
aros
Daje radę. Myślałem, że będzie gorzej, ale aktualnie przy 4 tys. rekordów nie przekracza sekundy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.