Jak połączyć wiele tabel, w tym tabelę odnośników, i zwracać dane w wierszach
Próbuję wyświetlić kilka prostych wyników gier komputerowych i ułatwić iterację po wierszu wyników w moim kodzie. Chcę, aby wszystkie istotne dane dla każdej gry znajdowały się w każdym rekordzie, dzięki czemu mogę wydrukować wszystko w jednej linii, np .:
Drużyna A (wynik45) vs.Drużyna B (wynik55), czas trwania gry:5 minZespół C (wynik60) vs.Zespół D (wynik65), czas trwania gry:4.3 minTak więc w grze są dwie drużyny, które grają ze sobą, a każda z nich otrzymuje wynik na koniec gry. Zasadniczo kończą się dwoma wierszami w tabeli games_teams dla każdej gry.
Oto mój schemat:
Oto moje dane tabeli:
Oto wyjście, które próbuję osiągnąć, dzięki czemu mogę łatwo iterować wyniki i wyświetlać je na stronie:
Udało mi się to osiągnąć dzięki przerażającemu SQL i wielu podobnym zapytaniom:
SELECT games.game_id, game_name, game_duration,
(SELECT team_id FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 0, 1) AS team_id_a,
(SELECT team_id FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 1, 1) AS team_id_b,
(SELECT teams.team_name FROM games_teams INNER JOIN teams ON games_teams.team_id = teams.team_id WHERE games.game_id = game_id LIMIT 0, 1) AS team_name_a,
(SELECT teams.team_name FROM games_teams INNER JOIN teams ON games_teams.team_id = teams.team_id WHERE games.game_id = game_id LIMIT 1, 1) AS team_name_b,
(SELECT team_score FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 0, 1) AS team_score_a,
(SELECT team_score FROM games_teams WHERE games.game_id = games_teams.game_id LIMIT 1, 1) AS team_score_b
FROM games
Problem z tą metodą polega na tym, że będzie powolny i nie skaluje się. Muszę także wyciągnąć inne statystyki gry z tabeli games_teams, aby były jeszcze więcej zapytań.
Inną metodą, którą próbowałem, była:
Osiągnąłem to za pomocą następującego SQL:
SELECT games.game_id, game_name, game_duration, teams.team_id, team_name, team_score
FROM games
INNER JOIN games_teams ON games.game_id = games_teams.game_id
INNER JOIN teams ON games_teams.team_id = teams.team_id
Teraz ten sposób będzie trudniejszy do przewidzenia w kodzie, ponieważ odpowiednie dane dla każdej gry znajdują się w dwóch różnych rekordach. Musiałbym zbudować pierwszą część wiersza, a następnie przejść do następnej iteracji pętli i wydrukować następną część. Następnie rozpocznij wszystko od nowa w następnej grze, próbuję wyświetlić wszystkie informacje w jednym wierszu, takie jak:
Drużyna A (wynik 45) vs Drużyna B (wynik 55), czas gry: 5 minut
Dlatego myślę, że byłoby łatwiej, gdyby to wszystko było na jednej płycie. Czy jest jakiś sposób, aby to ładnie zrealizować, więc skaluje się tak dobrze, jeśli potrzebuję więcej kolumn w tabeli games_teams?
Oto link do pastebin z kodem bazy danych, jeśli chcesz go odtworzyć.
Każda pomoc bardzo ceniona, dzięki!