2012-07-18 63 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来获得团队的每个总数。