2017-09-04 62 views
0

表:TAB1使用MySQL的加入兩個表

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 

如何獲得我的預期結果?

+2

爲什麼你在做SUM(req.trequest)?我認爲,因爲SUM(req.trequest),你得到了錯誤的結果... –

+0

我需要SUM trequest從tab1和計數從tab2 – Thiyagu

回答

2

讓我們根據zoneid和id分別找到trequestcount的總和。然後在內部聯接中使用這兩個結果(t1 and t2)

問題中顯示的計數不匹配問題是由於多行滿足連接條件而發生的。

在此解決方案中,我們將只在每個zoneid的結果(t1 and t2)中有一個條目。所以避免了這個問題。

注意:如果沒有任何區別,您可以從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 
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 
0

而不是req.zoneid。你應該嘗試win.zoneid。表2中的行似乎是多次計數的,因爲表2中的zoneid會出現兩次。所以win.zoneid會分組它並避免重複。

更新:由@mayur panchal發佈的解決方案是正確的,因爲您不需要對第一個表中的行進行SUM,因爲它們屬於不同的zoneid。如果你總結他們,你顯然會得到20重複兩次。