Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]SELECT, UNION i SUM
aros
post 30.01.2013, 04:18:58
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


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

Ten post edytował aros 30.01.2013, 04:28:19
Go to the top of the page
+Quote Post
mmmmmmm
post 30.01.2013, 08:09:43
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


I ile to się wykonuje dla jakiej ilości rekordów... Toż to jest "bazozabijacz"...
Go to the top of the page
+Quote Post
aros
post 31.01.2013, 21:36:02
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 21.03.2008

Ostrzeżenie: (0%)
-----


Daje radę. Myślałem, że będzie gorzej, ale aktualnie przy 4 tys. rekordów nie przekracza sekundy.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 13.06.2025 - 09:23