2010-05-14 3 views
2

Je travaille sur un petit projet en ce qui concerne la prochaine Coupe du monde. Je construis un alignement/leaderboard/tableau de bord basé sur des groupes avec des équipes nationales. L'idée est d'avoir des informations sur tous les matchs à venir dans le groupe ou dans la phase à élimination directe (scores, temps du match, statistiques de match, etc.). Actuellement, je suis coincé avec la base de données en ce sens que je ne peux pas proposer une requête qui retournerait les équipes jumelées d'affilée. J'ai ces 3 tables:Mysql plusieurs à plusieurs problèmes (leaderborad/tableau de bord)

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`) , 

J'ai simplifié les tables afin que nous n'allions pas dans la mauvaise direction. Maintenant, j'ai essayé toutes sortes de jointures et de groupements auxquels je pouvais penser, mais je n'ai jamais l'air de l'avoir.

Exemple requête:

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 

qui retourne:

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

Mais ce que je veux vraiment est:

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

Gardez à l'esprit qu'un groupe a plus de matches que je veux voir tous ces matchs pas seulement un.

N'importe quel pointeur ou suggestion serait extrêmement apprécié puisque je suis coincé comme un canard sur celui-ci :).

Répondre

1

Depuis un match de football est composé de toujours deux équipes, jamais plus et jamais moins, et l'ordre est aussi d'importance car il y a une équipe 1 et une équipe 2, je voudrais simplement ajouter team_1 et team_2 champs wc_match et supprimez la table wc_team_has_match.

Cela simplifierait votre requête considérablement:

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: Juste remarqué que vous avez l'intention aussi de conserver les informations sur les matches des seizièmes de finale, où les équipes pour chaque match pourrait ne pas avoir été décidé pour le moment. Vous pouvez toujours conserver le même modèle, ce qui rend les valeurs team_1 et team_2 nulles. Dans ce cas, vous voudrez utiliser LEFT JOINs au lieu de INNER JOINs afin de recevoir un résultat comprenant NULL équipes. La raison de NULL dans SQL est de définir des informations inconnues, et donc correspond parfaitement à ce cas.

+0

un Nice. J'ai toujours tendance à trop compliquer les choses :). Merci à la tête. – zoko2902

+0

Les paires Knockout seront entrées plus tard, lorsqu'elles sont connues. J'ai donc mis un champ dans la table qui couvre les étapes de la Coupe puisqu'il y en a deux. – zoko2902

1

je suggère de changer votre table team_has_match-teams_for_match qui contient une référence pour chaque équipe:

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

vous pouvez alors sélectionner les deux équipes pour un match avec:

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; 

J'espère que cela fonctionne comme vous l'attendez.

ps. En dehors de cela, vous pouvez simplement ajouter team1_id et team2_id colonnes à votre table wc_team, pas besoin de créer une table supplémentaire

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`) 
) 
+0

Merci knittl, juste sur le point dans ma direction, mais Daniel cloué au début. – zoko2902