Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Złączenie wszystkich rekordów w jeden
Forum PHP.pl > Forum > Bazy danych > MySQL
shark121
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`
ylk
Użyj JOIN
shark121
  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.
trafas
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.
shark121
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).
trafas
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 ?
shark121
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.
trafas
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
shark121
Wielkie dzięki! smile.gif
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.