2014-12-23 66 views
0

爲什麼總結多列 - 意外的結果

這是不是給出不正確的結果?

SELECT 
    people.name, 
    SUM(allorders.TOTAL), 
    SUM(allorders.DISCOUNT), 
    SUM(allorders.SERVICECHARGE), 
    SUM(payments.AMOUNT) 
FROM 
    people 
INNER JOIN 
    allorders ON allorders.CUSTOMER = people.ID 
INNER JOIN 
    payments ON payments.CUSTOMER = people.ID 
WHERE 
    people.ID = 7 AND allorders.VOIDED = 0 AND payments.VOIDED = 0 

得到:(名),1644000,1100000,50000,1485000

如果我做兩個表在時間(INNER JOIN人allorders.CUSTOMER = people.ID)在單獨的查詢,我得到了正確的結果。我甚至不知道我得到的數字來自哪裏。像:

SELECT 
    people.name, 
    SUM(allorders.TOTAL), 
    SUM(allorders.DISCOUNT), 
    SUM(allorders.SERVICECHARGE) 
FROM 
    people 
INNER JOIN 
    allorders ON allorders.CUSTOMER = people.ID 
WHERE people.ID = 7 AND allorders.VOIDED = 0 

得到:(名),822000,550000 25000

SELECT 
    people.name, 
    SUM(payments.AMOUNT) 
FROM 
    people 
INNER JOIN payments ON payments.CUSTOMER = people.ID 
WHERE people.ID = 7 AND payments.VOIDED = 0 

得到:(名),297000

它看起來就像雙打,但我不」不知道爲什麼。

奇怪的是我有一個類似的查詢,正確地做到了這一點。我會發布它,但它有點複雜。這裏是:

SELECT 
    t1.IDENTIFIER, 
    ifnull(t1.NAME,""), 
    t1.PRICE, 
    t1.GUESTS, 
    t1.STATUS, 
    ifnull(t1.NOTE,""), 
    t1.LINK, 
    ifnull(t1.EDITOR,""), 
    concat(t2.FIRSTNAME,"",t2.LASTNAME), 
    t2.ID, 
    t3.ID, 
    ifnull(t1.EMAIL,""), 
    ifnull(t3.PHONE,""), 
    ifnull(SUM(p1.AMOUNT),0), 
    ifnull(SUM(o1.DISCOUNT),0), 
    ifnull(SUM(o1.TOTAL),0), 
    ifnull(SUM(o1.SERVICECHARGE),0) 
FROM 
    tables t1 
INNER JOIN 
    people t2 ON t1.SELLER = t2.ID 
INNER JOIN 
    people t3 ON t1.CUSTOMER = t3.ID 
INNER JOIN 
    orderpaymentinfo ON orderpaymentinfo.TABLEID = t1.IDENTIFIER 
INNER JOIN 
    payments p1 ON orderpaymentinfo.PAYMENTID = p1.PAYMENTID 
INNER JOIN 
    allorders o1 ON o1.ORDERID = orderpaymentinfo.ORDERID 
WHERE 
    p1.VOIDED = 0 AND o1.VOIDED = 0 AND t1.DATE = "2014-12-20" 
GROUP BY t1.IDENTIFIER 

後者聲明做同樣的連接,只是它使用一個額外的輔助表。我很抱歉它格式有點不好(我對SO的格式化程序不太瞭解),但是如果有人能告訴我這兩個語句中的邏輯與另一個語句中的完全錯誤之間的區別,我會非常高興。

響應回答:

結果1:

Name - 5 

結果2:

Name - 2 

結果3:

Name - 10 

結果4是在phpMyAdmin截斷 - 我會在哪裏得到這很容易?

三個表格的表格結構如下所示:

SHOW正在創建中。

+0

好吧,很明顯,你在這裏發生了一些意想不到的多對多關係,你需要找出不清楚的地方。我會稍後發佈一個更長的答案作爲答案,即使答案本身將取決於您需要嘗試的某些查詢...一刻 – evanv

+0

感謝無論誰格式化我的問題。 是否因爲我在最後一個查詢中使用了兩個表(t2和t3),它起作用了嗎? – nickdnk

+2

nickdnk這個問題與人們訂單和人員支付之間的一對多關係有關,您可能需要確定什麼支付意味着加入的順序以減少總和上的人爲膨脹。或者,您可能需要分別對每一個進行求和,然後添加結果。發生什麼事是一個笛卡兒正在發生,你不期望。消除聚合並查看特定用戶,如果您真正瞭解數據和連接,就會發現問題。 – xQbert

回答

1

好了,所以我敢肯定你已經連接條件這基本上爆炸的結果集變得像一個笛卡爾乘積。這就是我想你應該嘗試

首先,運行以下和共享輸出:

SELECT p.name,COUNT(*) 
FROM people as p 
INNER JOIN allorders AS a 
ON a.CUSTOMER = p.ID 
WHERE p.ID = 7 AND a.VOIDED = 0 
GROUP BY p.name 

然後運行

SELECT p.name,COUNT(*) 
FROM people AS p 
INNER JOIN payments AS pay 
ON pay.CUSTOMER = p.ID 
WHERE p.ID = 7 AND pay.VOIDED = 0 
GROUP BY p.name 

然後運行

SELECT 
     p.name, 
     COUNT(*) 
    FROM 
     people as p 
    INNER JOIN 
     allorders as a ON a.CUSTOMER = p.ID 
    INNER JOIN 
     payments as pay ON pay.CUSTOMER = p.ID 
    WHERE 
     p.ID = 7 AND a.VOIDED = 0 AND pay.VOIDED = 0 
    GROUP BY p.name 

末運行以下

SHOW CREATE TABLE people; 
SHOW CREATE TABLE payments; 
SHOW CREATE TABLE allorders; 

問題是您沒有正確理解您的數據。你需要給我們更多關於數據和關係的信息,我在這裏描述的輸出應該會有所幫助。我不是一個答案。但是,如果您運行這些查詢並粘貼它們的輸出,則應該能夠從我或其他人那裏獲得答案。基於上述討論

及以上的編輯,請嘗試:

SELECT 
    p.name, 
    SUM(o.TOTAL), 
    SUM(o.DISCOUNT), 
    SUM(o.SERVICECHARGE), 
    MAX(pay.amt) 
FROM 
    people as p 
INNER JOIN 
    allorders AS o ON o.CUSTOMER = p.ID 
INNER JOIN (SELECT customer, 
      SUM(amount) as amt 
      FROM payments 
      WHERE voided = 0 AND customer = 7 
      GROUP BY customer) AS pay 
    ON pay.customer = p.id 
WHERE 
    p.ID = 7 AND o.VOIDED = 0 
GROUP BY p.name 

你也可以在你的SELECT語句做一個子查詢,但它很討厭海事組織。你也可以做min(pay.amt)或者avg,甚至可以把總計放在一起。以上應該工作...即使有更乾淨的方式。我提供了這個答案,所以你可以推斷你爲什麼會得到意想不到的結果......實際上,優化你的查詢是一個不同的問題,你可以稍後進入,一旦你有機會看看這個

+0

那麼,人已經做了5個訂單,但只有2個付款。那有什麼不好? 5個訂單在訂單表中,鏈接到人員表格,2個付款在付款表格中,再次鏈接到人員表格。 雖然我很欣賞你告訴我我不應該做的事實,但是我很難從我應該做的事情中扣除:/ – nickdnk

+0

@nickdnk假設支付訂單付款,你的'付款表「應該有一個'orderID'列。使用該列將'payments'加入'allorders',而不是將兩者都加入到'people'。 –

+0

研究笛卡爾聯接。這可能有所幫助:http://stackoverflow.com/questions/12464037/two-sql-left-joins-produce-incorrect-result/12464135#12464135 – evanv