使用mysql连接两个表

使用mysql连接两个表,mysql,join,Mysql,Join,表:表1 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

表:表1

  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
表:表2

 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

如何获得我期望的结果?

让我们先尝试sum
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

在子查询连接表之后,让我们在子查询中尝试第一个sum
win.count
和group记录。尝试以下方法:

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

而不是
req.zoneid
。您应该尝试
win.zoneid
。似乎是表1中的行被计数了多次,因为表2中的zoneid出现了两次。因此,
win.zoneid
将对其进行分组并避免重复


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

而不是
req.zoneid
。您应该尝试
win.zoneid
。似乎是表1中的行被计数了多次,因为表2中的zoneid出现了两次。因此,
win.zoneid
将对其进行分组并避免重复


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

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

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

在这个解决方案中,在结果
(t1和t2)
中,每个
zoneid
只有一个条目。因此,问题得以避免

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

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

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

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

在这个解决方案中,在结果
(t1和t2)
中,每个
zoneid
只有一个条目。因此,问题得以避免

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

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

你为什么要做求和?我想因为求和(req.trequest)你得到了错误的结果…我需要从表1求和,从表2计数为什么你要求和(req.trequest)?我认为由于求和(req.trequest),您得到了错误的结果…我需要从表1求和trequest,从表2计数