我有5個表,我想LEFT JOIN在一起。表格爲: 訪問者,優惠,合同1,合同2和合同3。根據其他列包含多個LEFT JOIN Mysql總結不同
QUERY:這裏
SELECT
count(DISTINCT visitors.ID) as visitors,
sum(
CASE
WHEN offers.ACTIVE = 1 THEN 1
ELSE 0
END) as offers,
count(contracts1.ID) as contracts1, sum(contracts1.PRICE) as sum_contracts1,
count(contracts2.ID) contracts2,
sum(
CASE
WHEN contracts2.PAYMENT = 'YEARLY' THEN contracts2.PRICE
WHEN contracts2.PAYMENT = 'TWICE' THEN contracts2.PRICE*2
ELSE contracts2.PRICE*4
END) as sum_contracts2,
count(contracts3.ID) as contracts3, sum(contracts3.PRICE) as sum_contracts3
FROM visitors
LEFT JOIN offersON offers.VISITOR_ID = visitors.ID AND (offers.IP > 100 OR offers.IP < 0)
LEFT JOIN contracts1 ON
(offers.ID = contracts1.ID_OFFER)
LEFT JOIN contracts2 ON
(offers.ID = contracts2.ID_OFFER)
LEFT JOIN contracts3 ON
(offers.ID = contracts3.ID_OFFER)
WHERE visitors.TIME >= '2017-01-01 00:00:00' AND visitors.TIME <= '2017-05-25 23:59:59'
問題是,contracts1,contracts2和contracts3沒有共同的列,以便被接合在一起。所以不是20行的合約1,30的是合同2和50的合約3,我得到了所有這些組合。因爲他們根據訪問者加入並提供表格。簡單的GROUP BY在查詢結束時通常會解決問題,但是如果我在END中爲其中一個表(或全部)使用GROUP BY,它將創建多行而不是1。而且它也會清除我通過ID計數訪問者的部分的所有其他結果以及ID提供的部分...我可以在SELECT的count()部分上使用DISTINCT,但不能使用sum(),因爲合同的PRICE可能是相同的,即使身份證不是(你知道,例如2個巧克力是2行不同的ID,但價格相同,每個10美元)。
所以我的問題是:
有什麼辦法來總結只有contracts1,contracts2和contracts3的那些價格,即有不同的ID,雖然擺脫加起來的複製品?這有可能沒有創建VIEW?
我也嘗試了GROUP BY裏面的LEFT JOIN,但是再次當我左側連接所有3個合同表時,即使我在他們之前對它們進行了重新分組。預期的結果的
實施例:
在我指出上述我期望的時間範圍:具有35個報價和5 contracts1與千歐元總和,12 contracts2與686歐元總和 80訪問者3份合同3,總計12歐元。它是8行數據的一行。
取而代之的是我得到的結果: 80個訪客,35個offer,180個contract1(總數也不好),180個contract2(總數也不好),180個contract3(總數也不好)。
乍一看似乎是一個正常化問題所在。您可以在任何地方一對一地加入它們,無法獲得所需的結果。或者如果存在這種可能性,請在子查詢中使用它並在其上進行JOIN。 – Mihai
是的,數據庫是一個大混亂。我想創建一個選擇而不是許多,以使其更快。另外這一選擇應該給我只有6列的數據,只有一行。在這種情況下,您可以使用一個例子來說明加入子查詢的含義嗎?此外,我會添加一些例子(進入我的問題)的預期結果,我想實現。 – Redrif
首先用最少的連接(SUM .. FROM x JOIN y)獲得正確的總和。使用上面的查詢將它加入到主查詢中。問題,據我所見,是你從所有的連接。 – Mihai