Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Złączenie wszystkich rekordów w jeden
shark121
post
Post #1





Grupa: Zarejestrowani
Postów: 62
Pomógł: 5
Dołączył: 31.03.2008

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


Witam, staram się stworzyć pewien system meczowy dla gry multiplayer oparty o bazę danych MySQL. Pierwsza tabela zawierająca dane spotkania ma taką postać:

id | match_id | team1_id | team2_id | date | event_id | group_id

Druga to szczegółowe dane na temat wyników na każdej mapie i ma ona taką postać:

id | match_id | map_name | score_team1 | score_team2

Doszedłem do wniosku, że tabele te muszą być zbudowane właśnie w ten sposób, ponieważ liczba map dla danego spotkania może być różna (od 1 do nawet 5). I teraz mam pewien problem, a mianowicie jednym zapytaniem chciałbym wyciągnąć wszystkie dane meczu oraz wynik ogółem, kombinowałem coś z union select ale nie za bardzo mi to wychodzi. Na tę chwilę udało mi się jedynie napisać zapytanie wyświetlające wszystkie mapy jako oddzielne rekordy, a ja chciałbym żeby to wszystko zamieniło się w jeden wspólny.

  1. SELECT M.`id` AS `match_id` , M.`team1_id`, M.`team2_id`, M.`date`, M.`event_id`, M.`group_id`, M.`hltv`, M.`stream`, MP.`map_name`, MP.`score_team1`, MP.`score_team2` FROM `matches` M, `matches_maps` MP WHERE M.`id` = MP.`match_id`
Go to the top of the page
+Quote Post
ylk
post
Post #2





Grupa: Zarejestrowani
Postów: 194
Pomógł: 26
Dołączył: 9.01.2011
Skąd: /dev/null

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


Użyj JOIN
Go to the top of the page
+Quote Post
shark121
post
Post #3





Grupa: Zarejestrowani
Postów: 62
Pomógł: 5
Dołączył: 31.03.2008

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


  1. SELECT M.`id` AS `match_id` , M.`team1_id`, M.`team2_id`, M.`date`, M.`event_id`, M.`group_id`, M.`hltv`, M.`stream`, MP.`score_team1`, MP.`score_team2` FROM `matches` M LEFT JOIN (`matches_maps` MP) ON M.`id` = MP.`match_id`


Powiedzmy teraz, że mam 3 mapy, czy da się zrobić tak żeby bez potrzeby używania wielu dodatkowych zapytań uzyskać z trzech map w postaci jednego rekordu? Bo w tym momencie otrzymuję trzy rekordy które różnią się tylko i wyłącznie wynikami na poszczególnych mapach.

Ten post edytował shark121 6.02.2011, 16:50:48
Go to the top of the page
+Quote Post
trafas
post
Post #4





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


Witam,

Wrzuć może strukturę tabel i przykładowe dane ( najlepiej w kodzie SQL ) i napisz konkretnie, jaki wynik chciałbyś osiągnąć.

Czyli jakie dane meczu oraz jaki wynik ogółem chcesz uzyskać dla tych przykładowych danych.
Go to the top of the page
+Quote Post
shark121
post
Post #5





Grupa: Zarejestrowani
Postów: 62
Pomógł: 5
Dołączył: 31.03.2008

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


No więc oto najprostszy przykład, który zobrazuje to co chce uzyskać:

tabela mecze z podstawowymi danymi meczu (okrojona wersja żeby bez zbędnych rzeczy to zobrazować)
  1. CREATE TABLE `mecze` (
  2. `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
  3. `team1_id` INT( 11 ) NOT NULL ,
  4. `team2_id` INT( 11 ) NOT NULL ,
  5. INDEX ( `id` )
  6. )


tabela mecze_mapy z danymi dotyczącymi każdej mapy
  1. CREATE TABLE `mecze_mapy` (
  2. `id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
  3. `mecz_id` INT( 11 ) NOT NULL ,
  4. `team1_score` INT( 11 ) NOT NULL ,
  5. `team2_score` INT( 11 ) NOT NULL ,
  6. INDEX ( `id` )
  7. )


Przykładowe dane:
  1. INSERT INTO `mecze` ( `id` , `team1_id` , `team2_id` ) VALUES (NULL , '1', '2'), (NULL , '1', '3');
  2. INSERT INTO `mecze_mapy` ( `id` , `mecz_id` , `team1_score` , `team2_score` ) VALUES (NULL , '1', '16', '10'), (NULL , '1', '16', '10'), (NULL , '2', '16', '5'), (NULL , '2', '10', '16'), (NULL , '2', '5', '16');


No i teraz chciałbym żeby jedno zapytanie zwróciło mi dla jednego meczu jeden rekord w którym znajdą się wyniki wszystkich map (nie mam żadnego pomysłu w jaki sposób zaprezentować w ogóle te połączone wyniki).

Ten post edytował shark121 6.02.2011, 17:42:46
Go to the top of the page
+Quote Post
trafas
post
Post #6





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


Sprawdź sobie wynik poniższego zapytania:

  1. SELECT
  2. m.id AS 'Id meczu',
  3. m.team1_id AS 'Id drużyny 1',
  4. sum(mm.team1_score) AS 'Wynik drużyny 1',
  5. m.team2_id AS 'Id drużyny 2',
  6. sum(mm.team2_score) AS 'Wynik drużyny 2'
  7. FROM
  8. mecze m
  9. JOIN mecze_mapy mm ON mm.mecz_id = m.id
  10. GROUP BY m.id


Dla danego meczu sumuje ono wszystkie wyniki dla team 1 i 2.

O takie coś Ci chodziło ?
Go to the top of the page
+Quote Post
shark121
post
Post #7





Grupa: Zarejestrowani
Postów: 62
Pomógł: 5
Dołączył: 31.03.2008

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


Niestety nie, sumowanie nie wchodzi w gre, bo w późniejszym etapie będę potrzebował albo ogólnego wyniku w postaci np. 2:0 lub 2:1 albo wyników poszczególnych map. W podanym przeze mnie przykładzie wyniki powinny być następujące: w meczu o id=1 wynik 2:0, a w meczu o id=2 wynik 1:2. Satysfakcjonowałoby mnie dowolne rozwiązanie, które pozwoli mi później stwierdzić rezultat której drużyny jest większy, czyli która drużyna rzeczywiście wygrała spotkanie.
Go to the top of the page
+Quote Post
trafas
post
Post #8





Grupa: Zarejestrowani
Postów: 87
Pomógł: 12
Dołączył: 31.05.2006

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


Ok.

W takim razie wynik dla poszczególnego meczu:

  1. SELECT
  2. m.id AS 'Id meczu',
  3. m.team1_id AS 'Id drużyny 1',
  4. sum(
  5. case when mm.team1_score > mm.team2_score then 1 else 0 end
  6. ) AS 'Wynik drużyny 1',
  7. m.team2_id AS 'Id drużyny 2',
  8. sum(
  9. case when mm.team2_score > mm.team1_score then 1 else 0 end
  10. ) AS 'Wynik drużyny 2'
  11. FROM
  12. mecze m
  13. JOIN mecze_mapy mm ON mm.mecz_id = m.id
  14. GROUP BY m.id



Wynik dla poszczególnej mapy dla danego meczu:

  1. SELECT
  2. m.id AS 'Id meczu',
  3. m.team1_id AS 'Id drużyny 1',
  4. sum(
  5. case when mm.team1_score > mm.team2_score then 1 else 0 end
  6. ) AS 'Wynik drużyny 1',
  7. m.team2_id AS 'Id drużyny 2',
  8. sum(
  9. case when mm.team2_score > mm.team1_score then 1 else 0 end
  10. ) AS 'Wynik drużyny 2'
  11. FROM
  12. mecze m
  13. JOIN mecze_mapy mm ON mm.mecz_id = m.id
  14. GROUP BY m.id,mm.id
Go to the top of the page
+Quote Post
shark121
post
Post #9





Grupa: Zarejestrowani
Postów: 62
Pomógł: 5
Dołączył: 31.03.2008

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


Wielkie dzięki! (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 06:29