使用mysql加入两个表

时间:2017-09-04 12:42:50

标签: mysql join

表:TAB1

  id    date_time            zoneid  accountid  slotid     trequest  bidder width   height
_50832  2017-09-04 15:41:06  153     1654       153x468x60  10       aaa      468   60
_50832  2017-09-04 15:41:06  152     1654       152x468x60  10       bbb      468   60

表:TAB2

 id     date_time             zoneid    accountid   slotid      bidder count    
_50832  2017-09-04 15:41:06   152       1654        152x468x60  bbb     6   
_50832  2017-09-04 15:41:06   152       1654        152x468x60  bbb     4   
_50832  2017-09-04 15:41:06   153       1654        153x468x60  aaa     9   
_50832  2017-09-04 15:41:06   153       1654        153x468x60  aaa     1   

下面是我的查询:

SELECT SUM(req.trequest) as REQ, SUM(win.count) as IMP
 FROM tab1  as req
JOIN tab2 as win ON (req.id=win.id AND req.zoneid=win.zoneid)
GROUP BY req.zoneid

我得到以下结果,

REQ IMP
20  10
20  10

IMP计数是正确的,但我的REQ计数错误。我的预期结果是

REQ IMP
10  10
10  10

如何获得我的预期结果?

3 个答案:

答案 0 :(得分:2)

让我们根据zoneid和id分别找到trequestcount的总和。然后在内部联接中使用这两个结果( t1 and t2 )

问题中显示的计数不匹配问题是由于满足连接条件的多行而发生的。

在此解决方案中,我们在结果zoneid中的每个( t1 and t2 )只有一个条目。所以问题就避免了。

注意:如果id子句没有任何区别,您可以从GROUP BY子句中删除。

SELECT t1.id, t1.zoneid, t1.REQ, t2.IMP FROM

(SELECT id,zoneid,SUM(trequest) as REQ 
 FROM tab1  GROUP BY zoneid,id ) t1

INNER JOIN

(SELECT id,zoneid SUM(win.count) as IMP
 FROM tab2  GROUP BY zoneid,id ) t2

ON t1.id = t2.id 
AND t1.zoneid = t2.zoneid

答案 1 :(得分:1)

在连接表之后,让我们首先尝试求和win.count并在子查询中对记录进行分组。请尝试以下方法:

SELECT SUM(req.trequest) as REQ, SUM(win.count) as IMP
FROM tab1 as req
JOIN (
    SELECT SUM(win.count) as IMP, win.zoneid, win.id 
    FROM tab2 as win 
    GROUP BY win.zoneid, win.id) AS win ON req.id=win.id AND req.zoneid=win.zoneid
GROUP BY req.zoneid

答案 2 :(得分:0)

而不是req.zoneid。你应该试试win.zoneid。看起来表1中的行被多次计数,因为表2中的zoneid来了两次。因此win.zoneid会对其进行分组并避免重复。

更新:@mayur panchal发布的解决方案是正确的,因为您不需要对第一个表中的行进行SUM,因为它们属于不同的zoneid。如果你理解它们,你显然会重复20次。