使用mysql连接两个表
表:表1使用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
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计数