Mysql много ко многим задачам (лидерам / табло) - PullRequest
2 голосов
/ 14 мая 2010

Я работаю над небольшим проектом в связи с предстоящим чемпионатом мира. Я строю список / таблицу лидеров / scoredboard на основе групп с национальными командами. Идея состоит в том, чтобы получить информацию обо всех предстоящих матчах в группе или на этапе нокаута (оценки, время матча, статистика матчей и т. Д.). В настоящее время я застрял с БД в том смысле, что не могу найти запрос, который бы возвращал парные команды подряд. У меня есть эти 3 таблицы:

CREATE  TABLE IF NOT EXISTS `wc_team` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `name` VARCHAR(45) NULL ,
      `description` VARCHAR(250) NULL ,
      `flag` VARCHAR(45) NULL ,
      `image` VARCHAR(45) NULL ,
      `added` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
      PRIMARY KEY (`id`) ,

CREATE  TABLE IF NOT EXISTS `wc_match` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `score` VARCHAR(6) NULL ,
      `date` DATE NULL ,
      `time` VARCHAR(45) NULL ,
      `added` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
      PRIMARY KEY (`id`) , 

CREATE  TABLE IF NOT EXISTS `wc_team_has_match` (
      `wc_team_id` INT NOT NULL ,
      `wc_match_id` INT NOT NULL ,
      PRIMARY KEY (`wc_team_id`, `wc_match_id`) ,

Я упростил таблицы, чтобы мы не пошли в неверном направлении. Теперь я пробовал все виды объединений и группировок, о которых мог только подумать, но, похоже, никогда не получал.

Пример запроса:

SELECT t.wc_team_id, t.wc_match_id, c.id.c.name, d.id, d.name
FROM wc_team_has_match AS t
LEFT JOIN wc_match AS s ON t.wc_match_id = s.id
LEFT JOIN wc_team AS c ON t.wc_team_id = c.id
LEFT JOIN wc_team AS d ON t.wc_team_id = d.id

Что возвращает:

 wc_team_id  wc_match_id    id name      id name    
         16           5        16 Brazil    16 Brazil
         18           5        18 Argentina 18 Argentina

Но я действительно хочу:

    wc_team_id  wc_match_id     id name      id name    
             16           5     16 Brazil    18 Argentina

Имейте в виду, что в группе больше совпадений, я хочу видеть все эти совпадения, а не только одно.

Любой указатель или предложение были бы чрезвычайно признательны, так как я застрял как утка на этом:).

Ответы [ 2 ]

1 голос
/ 14 мая 2010

Я предлагаю изменить таблицу team_has_match на teams_for_match, которая содержит ссылку для каждой команды:

CREATE TABLE `teams_for_match` (
  `match_id` INT,
  `team1_id` INT,
  `team2_id` INT,
  PRIMARY KEY (`match_id`, `team1_id`, `team2_id`)
);

затем вы можете выбрать обе команды для матча:

   SELECT *
     FROM `teams_for_match` tm
LEFT JOIN `wc_match` m
       ON tm.`match_id` = m.id
LEFT JOIN `wc_team` t1
       ON tm.`team1_id` = t1.id
LEFT JOIN `wc_team` t2
       ON tm.`team2_id` = t2.id;

Я надеюсь, что это работает так, как вы ожидаете.

пс. кроме этого, вы можете просто добавить team1_id и team2_id столбцы в вашу таблицу wc_team, не нужно создавать дополнительную таблицу

CREATE  TABLE IF NOT EXISTS `wc_match` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `score` VARCHAR(6) NULL ,
  `date` DATE NULL ,
  `time` VARCHAR(45) NULL ,
  `added` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
  `team1` INT FOREIGN KEY REFERENCES `wc_team`(`id`),
  `team2` INT FOREIGN KEY REFERENCES `wc_team`(`id`),
  PRIMARY KEY (`id`)
)
1 голос
/ 14 мая 2010

Поскольку футбольный матч всегда состоит из двух команд, никогда больше и никогда меньше, и порядок также имеет значение, поскольку есть команда 1 и команда 2, я бы просто добавил team_1 и team_2 полей в wc_match и удалите таблицу wc_team_has_match.

Это значительно упростит ваш запрос:

SELECT  m.wc_match_id, 
        t1.id   AS Team_1_ID,
        t1.name AS Team_1,
        t2.id   AS Team_2_ID,
        t2.name AS Team_2
FROM    wc_match AS m
JOIN    wc_team t1 ON (t1.id = m.team_1)
JOIN    wc_team t2 ON (t2.id = m.team_2);

EDIT : только что заметил, что вы также намереваетесь хранить информацию о матчах на этапах нокаута, где команды для каждого матча еще не были определены. Вы все еще можете использовать ту же модель, что делает team_1 и team_2 обнуляемыми. В этом случае вы захотите использовать LEFT JOINs вместо INNER JOINs, чтобы получить набор результатов, включающий NULL команд. Причина для NULL в SQL состоит в том, чтобы определить неизвестную информацию, и, следовательно, идеально подходит для этого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...