2012-07-18 88 views
1

我在「如何加入兩個以上的表」中看到了大量的線程,但是這些線程似乎都沒有解決我的問題。 我有三個表: teamspersonspayfiles在MySQL中,如何「加入」三張表

teams表看起來是這樣的:

DROP TABLE IF EXISTS `teams`; 
CREATE TABLE IF NOT EXISTS `teams` (
`team_id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(20) DEFAULT NULL, 
`leader` varchar(32) NOT NULL, 
    PRIMARY KEY (`team_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=30;` 

persons表:

DROP TABLE IF EXISTS `persons`; 
CREATE TABLE IF NOT EXISTS `persons` (
    `team_id` int(2) DEFAULT '0', 
    `hash` varchar(32) NOT NULL, 
    UNIQUE KEY `hash` (`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

payfiles表:

DROP TABLE IF EXISTS `payfiles`; 
CREATE TABLE IF NOT EXISTS `payfiles` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `hash` varchar(32) NOT NULL, 
    `deals_passed` int(2) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1298 ; 

表格有更多列,但爲了簡單起見,我修剪了它們。

teams表包含以下列方式記錄: 1Team 1afaf7878af78a 後者是球隊的領袖獨特的哈希值。

表的人包含了所有的個人信息,以及獨特的哈希值, 例如 李四其散列afaf7878af78a誰也隊1

payfile也有一個「哈希」的領導者列,該表包含計算員工支票所需的全部信息。

管理團隊希望瞭解公司的總體規劃。他們希望看到每一個團隊是多少錢帶來英寸

我面對這裏的問題,是「團隊」

試圖組的收入我最好的嘗試到目前爲止,這是

SELECT hash, SUM(deals_passed) as deals FROM payfiles JOIN persons ON persons.hash = payfiles.hash GROUP BY payfiles.hash

但我看不到一個優化的方式來查詢數據庫,以便按團隊的一般願景生成一個團隊而不改變數據庫的結構。

例如: John Doe和Jane Doe屬於「Team 1」,他們分別帶來了500美元和600美元。

我想產生類似:

「帶來了隊1 $ 1100」

我的另一種方法是更改​​數據庫的結構,並添加一個新列payfile表。這樣的列將是team_id,所以我可以很容易地查詢它,但數據庫目前有大約10,000條記錄,這意味着更新不考慮team_id列的10K記錄,並對GUI進行很多更改,我不會真的不想這樣做,但如果這是最簡單和最好的選擇,我會做。

謝謝!

回答

1
SELECT 
    teams.name, 
    SUM(payfiles.deals_passed) AS team_deals_passed 
FROM payfiles 
LEFT JOIN persons USING (hash) 
LEFT JOIN teams USING (team_id) 
GROUP BY teams.team_id 
+0

這就像一個魅力!萬分感謝! 但我仍然覺得有點困惑...... – ILikeTacos 2012-07-18 16:10:29

+0

最新的'LEFT JOIN'如何知道每個人屬於哪個團隊? – ILikeTacos 2012-07-18 16:10:51

+1

'使用(散列)'將新表的「散列」列與前面的表的「散列」相連接,在這種情況下爲payfiles.hash,'USING(team_id)'將新表組連接到更早的表team_id,在這種情況下是persons.team_id,你有一個鏈:payfiles-(散列)-persons-(team_id) - 隊 – 2012-07-18 16:19:33

0

您可以使用SUM()來獲取總數,並使用GROUP BY來獲得團隊的每個總數。