2012-05-29 59 views
1

我想弄清楚運行此查詢的最佳方法。我基本上需要返回僅在我們的系統中下單的客戶的「登錄」字段(登錄字段基本上是客戶ID /密鑰)列表。MySql分組

我們的系統上的一些背景...

通過放置在同一天一個客戶多個訂單是一個數量級的equalivant。原因是我們有多個供應商,任何時候有人訂購我們的購物車系統會將該單一訂單分成多個訂單 - 每個獨特供應商按該訂單訂購1份訂單。

下面是基本的MySQL查詢我拿出這麼遠..

SELECT 
xcart_orders.login, 
COUNT(xcart_orders.login) as c1, 
FROM_UNIXTIME(xcart_orders.date, '%Y-%m-%d') as d1 

FROM 
xcart_orders 

WHERE 
INSTR(xcart_orders.email, "marketplace") <= 0 

GROUP BY 
xcart_orders.login, 
FROM_UNIXTIME(xcart_orders.date, '%Y-%m-%d') 

ORDER BY 
xcart_orders.login 
ASC 

這是返回的數據的樣本...

login  c1  d1 
01crouse 1 2007-11-30 
022336010 2 2009-06-24 
022336010 1 2009-08-28 
02emzach 1 2011-08-25 
02emzach 1 2011-10-18 

這是返回我一個不錯的客戶名單,每個日期的唯一訂單計數

問題是 - 現在我需要將這個結果集合在一起,並且只返回有1個客戶在這個結果集中的獨特記錄 - 我不太清楚如何做到這一點

所以如果你看到上面的示例結果集 - 我需要返回01crouse出登錄列表 - 因爲該登錄只有1條記錄,有史以來第一個訂單,其他訂單有多個訂單。我希望這是有道理的 - 請讓我知道,如果你有使用具有

我recommened使用在所有

重要說明任何問題:

HAVING c1 = 1 

不幸的是擁有將無法正常工作 - 原因是因爲c1可能大於1,因此情況屬實。請記住,它在結果中每天給我一個訂單,因此 - 如果某人在同一天按順序向3個供應商下了一個訂單,那麼將在那一天導致3個訂單 - 但是 - 這是他們的一個訂單放置 - 這些類型的人將被排除使用HAVING

這就是爲什麼我需要進行分組,然後計算結果集 - 例如,登錄 - 在此計數返回1的任何記錄都是準確的 - 問題是我不知道如何對此結果集執行一組操作

回答

1

你可以做到這一點與另一SELECT(你原來的SELECT之外),像這樣:

SELECT login, c1, d1, count(login) as c2 
FROM (...YOUR SELECT...) as orig 
GROUP BY login 
HAVING c2 = 1 

這組原來的選擇由登錄,然後只顯示那些表示有一次的登錄,所以只有那些只有一天購物的用戶。

+0

這似乎有完成了這個訣竅 - 非常感謝。 – 99823

1

請參閱MySQL's HAVING clause。您已通過登錄進行分組,因此您應該可以簡單地添加HAVING COUNT(login) = 1

如果查詢變得更加複雜,則可以將此查詢始終嵌套在另一個查詢中,並通過執行另一個組,雖然。

+0

不幸的是,不會工作 - 原因是因爲c1可能大於1的情況下才是真實的。請記住,它在結果中每天給我一個訂單,因此 - 如果某人在同一天按順序向3個供應商下了一個訂單,那麼將在那一天導致3個訂單 - 但是 - 這是他們的一個訂單放置 - 這些類型的人將被排除使用HAVING – 99823

+0

它可能會幫助,如果你告訴我們你的預期輸出,那麼根據我對你的問題的解釋HAVING是你需要的,但我不能正確理解 –