2015-10-16 490 views
1

的我有2個查詢,第一個查詢是列出所有的客戶誰從時間一開始就進行購買:Mysql的查詢數據子集的

SELECT o.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS fullname, c.email, COUNT(o.id_customer) AS 'total' 
FROM ps_orders AS o 
LEFT JOIN ps_order_state_lang AS osl ON o.current_state = osl.id_order_state 
LEFT JOIN ps_customer AS c ON o.id_customer = c.id_customer 
WHERE o.current_state IN(2,4,5) 
AND osl.id_lang = 2 
AND o.invoice_date BETWEEN '2014-01-01' AND '2015-09-30' 
GROUP BY o.id_customer 
ORDER BY total DESC; 

而第二個查詢是列出所有的客戶誰做在特定的時間段購買:在此基礎上

SELECT c.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS fullname, COUNT(c.id_customer) AS total 
FROM ps_orders AS o 
LEFT JOIN ps_customer AS c ON o.id_customer = c.id_customer 
WHERE o.invoice_date BETWEEN '2015-01-01' AND '2015-01-31' 
AND o.current_state IN (2,4,5) 
GROUP BY c.id_customer 
ORDER BY total DESC; 

,我怎麼能得到所有客戶誰僅僅基於第二查詢中指定的期間做了他們的第一次購買。我如何使用這兩個查詢來做到這一點?謝謝。

編輯#1

我目前的解決辦法是這樣的:

SELECT a.id_customer, a.fullname, a.total AS 'this_month', b.total AS 'all_time' 
FROM (
    SELECT c.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS fullname, COUNT(c.id_customer) AS total 
    FROM ps_orders AS o 
    LEFT JOIN ps_customer AS c ON o.id_customer = c.id_customer 
    WHERE o.invoice_date BETWEEN '2015-01-01' AND '2015-01-31' 
    AND o.current_state IN (2,4,5) 
    GROUP BY c.id_customer 
    HAVING COUNT(c.id_customer) < 2 
    ORDER BY total DESC 
) AS a 
LEFT JOIN (
    SELECT o.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS fullname, c.email, COUNT(o.id_customer) AS 'total' 
    FROM ps_orders AS o 
    LEFT JOIN ps_order_state_lang AS osl ON o.current_state = osl.id_order_state 
    LEFT JOIN ps_customer AS c ON o.id_customer = c.id_customer 
    WHERE o.current_state IN(2,4,5) 
    AND osl.id_lang = 2 
    AND o.invoice_date BETWEEN '2013-12-31' AND '2015-01-01' 
    GROUP BY o.id_customer 
    HAVING COUNT(o.id_customer) < 2 
    ORDER BY total DESC 
) AS b ON b.id_customer = a.id_customer 
ORDER BY all_time DESC; 

是有這樣做的更好的辦法?

編輯2:

首先查詢是誰在我們的商店從一開始的時候進行購買所有客戶的清單。

第二個查詢是所有僅在特定月份進行購買的客戶的列表。

根據這2條查詢,我想列出第一次在特定月份進行購買的所有客戶。

編輯#3: 也許我不是很清楚我想達到什麼,所以讓我詳細說明一下。

我有一個名爲ps_orders的表,它從一開始就存儲所有的事務記錄。從ps_orders我在下面列特別感興趣:

  • id_customer
  • id_order
  • invoice_date

我想知道時間有多少首先從給定時間內的買家。例如:

我想知道有多少客戶是2015年1月1日和1月31日2015下面的查詢之間的首次置業列出了該確切日期間的所有訂單:

SELECT c.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS fullname, COUNT(c.id_customer) AS total 
FROM ps_orders AS o 
LEFT JOIN ps_customer AS c ON o.id_customer = c.id_customer 
WHERE o.invoice_date BETWEEN '2015-01-01' AND '2015-01-31' 
AND o.current_state IN (2,4,5) 
GROUP BY c.id_customer 
ORDER BY total DESC; 

如何有史以來結果包括在早日購買的客戶(例如,客戶編號1234可能在前一年購買)。不過,我只對第一時間買家感興趣。請參閱編輯#1,看我目前的解決方案(它包含了一些無效的數據,但我覺得我越來越接近我想要什麼)

+0

無法理解的問題「的基礎上的第二次指定的時間內第一次購買使用初始查詢生成一個連接表查詢「? – nik

+0

請參閱我的編輯#2謝謝 – Jeremy

回答

1

喜歡的東西

SELECT o.id_customer, MIN(o.invoice_date) first_purchase 
FROM ps_orders AS o 
GROUP BY o.id_customer 
HAVING first_purchase BETWEEN '2015-01-01' AND '2015-01-31' 

應該工作,不是嗎?如果你想要的只是美國消費者第一次購買的日期,我不知道這些全部購買是如何相關的。

因爲它似乎你想要的客戶名稱和電子郵件爲好,爲自己

SELECT c.id_customer, CONCAT(c.firstname, ' ', c.lastname) AS fullname, c.email, firsts.first_purchase 
FROM (
    SELECT 
     o.id_customer cid, 
     MIN(o.invoice_date) first_purchase 
    FROM ps_orders AS o 
    GROUP BY o.id_customer 
    HAVING first_purchase BETWEEN '2015-01-01' AND '2015-01-31' 
) firsts 
LEFT JOIN customer c ON firsts.cid = c.id_customer 
# If you prefer you may replace the HAVING above with a WHERE here 
# WHERE first_purchase BETWEEN '2015-01-01' AND '2015-01-31' 
+0

謝謝@Thernys,這是一個令人驚訝的簡短查詢。你能在這裏詳細說明MIN()嗎?我不知道它可以以這種方式使用,因爲據我所知,如果我想從記錄集中找到最小值,則使用MIN。 – Jeremy

+0

MIN是[MySQL集合函數](https://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html)之一,是的,它用於查找最小值一組值(一個表列)。在你的情況下,你想找到相關日期集合的最小值(客戶購買的最小/最早的日期)。 – Thernys

+0

@Jeremy我不確定你的'this_month'和'all_time'總數是否是你想要的數據,或者只是作爲結束的手段。它們當然也可以用於此查詢中。 – Thernys