Mysql 查询数据子集

Mysql Querying A Subset of Data

我有 2 个查询,第一个查询是列出所有从一开始就购买过的客户:

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的table,它存储了从一开始的所有交易记录。来自ps_orders我对以下专栏特别感兴趣:

我想知道在给定时间段内有多少首次购买者。例如:

我想知道有多少客户是 2015 年 1 月 1 日至 2015 年 1 月 31 日之间的首次购买者。以下查询列出了在该确切日期之间完成的所有订单:

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;

结果如何包括较早购买的客户(例如,客户 ID 1234 可能在前一年购买过)。然而,我只对那段时间内的第一次购买者感兴趣。请参阅编辑 #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'

应该可以,不是吗?如果您只想要用户首次购买的日期,我看不出历史购买有何相关性。

由于您似乎还需要客户名称和电子邮件,因此请使用此初始查询为您自己生成一个连接 table

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'