2015-02-16 2 views
0

У меня есть три таблицы (два являются важными и один раз для уточнения), которые выглядят следующим образом:MySQL JOIN, что я не могу обернуть мою голову вокруг

команды

_team_ID   name 
     1 Blue Team 
     2 Green Team 
     3 Black Team 

игра

_game_ID _team_left_ID _team_right_ID 
     1    1    2 
     2    2    1 
     3    1    2 

game_points

_game_points_ID _game_ID _team_ID 
       1   1   1 
       2   1   1 
       3   1   2 
       4   1   1 
       5   2   2 

_team_ID находится в _team_left_ID или _team_right_ID, в зависимости от того, с какой стороны они начали работать.

_team_ID в game_points - это команда, которая забила очко. Поэтому там должен быть COUNT().

То, что я хочу достичь, - это получить, сколько очков _team_ID 1 и 2 и попало в каждую игру, в которую они играли друг против друга, и у кого было больше очков.

В основном это:

_game_ID _team_left_ID _team_right_ID left_points right_points winner 
     1    1    2    3    1  1 
     2    2    1    1    0  2 
     3    1    2    0    0  NULL 

Пожалуйста, помогите!

+1

Вы сделали любую попытку себя – gpullen

+0

Да, но я всегда получаю left_points и right_points в том же номером или я их обоих 0. – Grappa

ответ

0

Я, по общему признанию, не проверял это, но считаю, что это должно помочь вам в правильном направлении. Я не уверен, что последняя строка выбора будет работать, но в худшем случае вы можете просто сравнить левые очки против правых очков, чтобы определить победителя.

SELECT 
game._game_ID, 
left_team._team_ID, 
right_team._team_ID, 
SUM(game_points._team_ID = left_team._team_ID) as left_pts, 
SUM(game_points._team_ID = right_team._team_ID) as right_pts, 
IF(SUM(game_points._team_ID = left_team._team_ID) = SUM(game_points._team_ID = right_team._team_ID),NULL,IF(SUM(game_points._team_ID = left_team._team_ID) > SUM(game_points._team_ID = right_team._team_ID), left_team._team_ID, right_team._team_ID)) as winner 
FROM game 
INNER JOIN team as left_team ON left_team._team_ID = game._team_left_ID 
INNER JOIN team as right_team ON right_team._team_ID = game._team_right_ID 
LEFT JOIN game_points ON game_points._game_ID = game._game_ID 
GROUP BY game._game_ID 

Добавление окончательного сценария использования только чтобы избавиться от ответа.

SELECT 
game._game_ID, 
left_team._team_ID, 
right_team._team_ID, 
SUM(game_points._team_ID = left_team._team_ID) as left_pts, 
SUM(game_points._team_ID = right_team._team_ID) as right_pts, 
CASE WHEN SUM(game_points._team_ID = left_team._team_ID) > SUM(game_points._team_ID = right_team._team_ID) THEN left_team._team_ID WHEN SUM(game_points._team_ID = left_team._team_ID) < SUM(game_points._team_ID = right_team._team_ID) THEN right_team._team_ID ELSE NULL END AS winner 
FROM game 
INNER JOIN team as left_team ON left_team._team_ID = game._team_left_ID 
INNER JOIN team as right_team ON right_team._team_ID = game._team_right_ID 
LEFT JOIN game_points ON game_points._game_ID = game._game_ID 
GROUP BY game._game_ID 
+0

Вы забыли присоединиться к right_gp в запросе. – Tom

+0

Это было фактически из предыдущей редакции. Я сначала присоединился к game_points, чтобы показать его правильно. Тогда я понял, что могу сделать то же самое с 1 соединением и агрегатной функцией. Я думаю, что у меня есть это прямо сейчас. – Camway

+0

Я думаю, что ваш оператор IF нуждается в работе. Вы собираетесь сравнить количество раз, когда у левой команды ID появляется количество раз, когда появляется правильный идентификатор команды.Вы не сравниваете очки. – Tom

0

Что касается дизайна БД ... Я не уверен, почему game_points - отдельная таблица.
Кажется, что это ненужная нормализация. Я бы просто поместил точки в таблицу игр с полями left_team_points и right_team_points. «Нормализовать, пока это не повредит, денормализовать, пока это не будет иметь смысла».

Поскольку ваш вопрос о присоединении, я оставил заявление о делах и условия ГДЕ для вас. (Если это назначение HW .... Я бы попросил вас пометить его тегом домашней работы.)

Я также понял, что вам не хватает поля точек из таблицы game_points.

Это не проверено - могут быть опечатки, но я думаю, что логика звучит.

SELECT game._game_ID, left_team._team_ID, right_team._team_ID, left_game_points.points, right_game_points.points, <CASE STATEMENT TO DETERMINE WINNER> 
FROM game 
JOIN team AS left_team ON left_team.id = game._team_left_ID 
JOIN team AS right_team ON right_team.id = game._team_right_ID 
JOIN game_points AS left_game_points ON left_game_points._game_ID = game._game_ID 
    and left_game_points._team_ID = team._team_ID 
JOIN game_points AS right_game_points ON right_game_points._game_ID = game._game_ID 
    and right_game_points._team_ID = team._team_ID 
+0

В game_points это одна строка за точку. У меня есть физическая кнопка, и мне нужно отслеживать время каждой точки. Извините, если не ясно. – Grappa

+0

ах. Я бы посоветовал в том числе создать в следующий раз инструкции для таблиц с вашим вопросом. FWIW, одна строка за точку также кажется плохим выбором дизайна. почему бы не просто увеличить? Возможно, если вы храните временную метку точки или человека, забившего ее. – Jody

Смежные вопросы