2016-09-02 59 views
0

我有兩個表oc_order ooc_order_total otMYSQL子查詢和包含的值

oc_order o的行數數有場o.customer_id, o.date_added, o.email,o.total

而且oc_order_total ot有場ot.codeot.value

我想只有當展示成果客戶訂單超過3次,即如果customer_id重複三次或更多的結果並顯示ot.value where ot.code = 'shipping'

我嘗試做以下


SELECT COUNT(o.customer_id) AS 'Orders Count', o.date_added, o.email,o.total, ot.value 
FROM oc_order o 
Inner join oc_order_total ot ON ot.order_id = o.order_id 
WHERE count(o.customer_id) > 3 AND ot.value = (select value from oc_order_total where code = 'shipping') 
GROUP BY o.customer_id 


我越來越無效使用組錯誤的,我覺得我不是在WHERE子句中使用正確的子查詢。

回答

1

您不能在WHERE聲明中使用SUM/COUNT。您需要使用這個HAVING運營商。試試這個查詢:

SELECT COUNT(o.customer_id) AS 'Orders Count', o.date_added, o.email,o.total, ot.value 

FROM oc_order o 
INNER JOIN oc_order_total ot ON ot.order_id = o.order_id AND 

WHERE ot.code IN (select value from oc_order_total where code = 'shipping') 

GROUP BY o.customer_id 
HAVING count(o.customer_id) > 3 

編輯:添加例如與ot.value不受GROUP BY

SELECT o.order_id, q.orders_count AS 'Orders Count', o.date_added, o.email,o.total, ot.value 

FROM oc_order o 
INNER JOIN oc_order_total ot ON ot.order_id = o.order_id 
INNER JOIN (SELECT o.customer_id, COUNT(o.customer_id) AS orders_count 

FROM oc_order o 
INNER JOIN oc_order_total ot ON ot.order_id = o.order_id 

WHERE ot.code IN (select value from oc_order_total where code = 'shipping') 

GROUP BY o.customer_id 
HAVING count(o.customer_id) > 3) AS q ON q.customer_id = o.customer_id 

這裏基本上會發生什麼是你預過濾器的客戶與以前的查詢,然後使用這些預過濾列表,讓這些客戶滿足您的條件單個訂單。在此個人orders_id上,您可以執行任何操作而無需分組,因爲您已經消除了不符合您需要的客戶。希望能幫助到你。

+0

我沒有做羣組,因爲它會將它們組合在一起,並將數量和價值彙總在一起。我想顯示所有的值。有沒有可能將它分組在一起? –

+0

您需要'GROUP BY'來使用COUNT,否則無論您的意圖如何,默認情況下它都會將其減少爲一行分組。然而,你可以使用另一個'SELECT'技巧和包裝查詢來首先獲得o.order_id,並且在你過濾了'JOIN'其他必要的列後,它們將不會受到'GROUP BY'的影響。編輯回答導致評論限制太短,無法舉例。 – StormoPL

1

NO,你得到錯誤導致您GROUP BY不包含SELECT列表中列出的所有列,你不能使用COUNT()一樣,在WHERE條件聚合函數;它僅在HAVING條款中被允許。您可以修改您的查詢,如

SELECT o.date_added 
    , o.email 
    , o.total 
    , ot.value 
    FROM oc_order o 
    JOIN oc_order_total ot 
    ON ot.order_id = o.order_id 
    JOIN 
    (SELECT COUNT(customer_id) AS 'Orders Count' 
      , customer_id 
     FROM oc_order 
     GROUP 
      BY customer_id 
    ) xxx 
    ON xxx .customer_id = o.customer_id 
WHERE xxx.`Orders Count` > 3 
    AND ot.code = 'shipping'; 
+0

@Strawberry,既沒有得到你的評論,也不是背後downvote的原因? – Rahul

0

首先,聚合不能在WHERE子句中引用。

當訪問行時,將評估WHERE子句中的謂詞。在檢索行時,MySQL沒有關於聚合函數返回值的任何信息(例如COUNT())。

COUNT()集合將被評估行被訪問,並在GROUP BY後操作。

可以在HAVING子句中引用一個聚合,遵循GROUP BY子句。

GROUP BY ... 
HAVING COUNT(...) > 3 

注意,HAVING子句的GROUP BY操作之後評價,和聚合表達式的的值進行評估。與WHERE子句大不相同。


此外,子查詢有點奇怪。因爲它是在平等比較中被引用的,所以子查詢最多可以返回一行。我們在查詢中看不到任何可以阻止這種情況的內容,除非code在`ot_中保證是唯一的。

如果code是唯一的,那麼我們根本不需要子查詢,我們可以測試代碼。

WHERE ot.code = 'shipping' 

如果有與在code列「運輸」多行,我們沒有看到任何保證這些行value列將是相同的。要測試任何可能的值,我們可以使用IN運算符而不是等號(標量)比較。例如

WHERE ot.value IN (SELECT v.value 
         FROM oc_order_total v 
         WHERE v.code = 'shipping' 
        ) 

但這看起來還是很奇怪的。奇怪的是,它使用相同的表作爲外部查詢。如果我們使用子查詢來查找與字符串code相關的value,那通常是一個單獨的查找表。我們通常更喜歡JOIN而不是IN (subquery)。很奇怪。


此外,在SELECT列表

o.date_added, o.email, o.total, ot.value 

不要出現在GROUP BY子句中的非集合表達式。大多數關係型數據庫都會拋出一個錯誤「非集合選擇不在組中」。

但是,MySQL擴展將允許查詢運行,但爲非聚合返回的值是不確定的。 MySQL會根據中某些行的值返回這些表達式的值,但不能保證哪一行會是。

通過在sql_mode變量中包含ONLY_FULL_GROUP_BY,我們也可以讓MySQL拋出像其他數據庫一樣的錯誤。