2010-05-14 19 views
2

我正在就即將舉行的世界盃問題開展一個小型項目。我正在根據國家隊的小組建立名冊/排行榜/計分卡。這個想法是獲得關於組內所有即將到來的比賽的信息或者在淘汰賽階段(比賽得分,比賽時間,比賽數據等)的信息。目前,我在數據庫中遇到了問題,因爲我無法想出一個能夠返回成對隊伍的查詢。我有這3個表格:Mysql多對多問題(leaderborad/scoreboard)

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 

請記住,一組有更多的比賽我想看到所有這些比賽不僅僅是一個。

任何指針或建議將非常讚賞,因爲我被困在這一個像一個鴨子:)。

回答

1

因爲足球比賽是由始終兩支球隊,從來沒有更多的,從來沒有少,而且順序是重要的也是因爲有一個團隊1和團隊2,我只想在wc_match添加team_1team_2領域並刪除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); 

編輯:只注意到你還打算繼續在淘汰賽階段的比賽,在球隊每場比賽可能沒有信息已經決定了。您仍然可以使用相同的型號,使team_1team_2爲空。在這種情況下,您希望使用LEFT JOINs而不是INNER JOINs以接收包含NULL團隊的結果集。 SQL中的NULL的原因是定義未知信息,因此完全適合這種情況。

+0

尼斯之一。我總是傾向於過分複雜:)。謝謝你的擡頭。 – zoko2902 2010-05-14 09:58:06

+0

淘汰賽階段paire將在稍後知道的時候輸入。所以我在桌子上設置了一個場地,因爲有幾個杯子。 – zoko2902 2010-05-14 10:24:28

1

我建議你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; 

我希望這個作品正如你所期望的那樣。

ps。除此之外,你可以簡單地添加team1_idteam2_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`) 
) 
+0

謝謝knittl,就在我的方向,但丹尼爾首先釘了。 – zoko2902 2010-05-14 10:00:43