【发布时间】:2015-10-16 08:00:30
【问题描述】:
我有两个查询,第一个查询是列出从一开始就购买的所有客户:
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
- 发票日期
我想知道给定时间段内有多少首次购买者。例如:
我想知道在 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 可能在前一年购买)。但是,我只对那段时间内的第一次购买者感兴趣。请参阅 EDIT #1 以查看我当前的解决方案(它包含一些无效数据,但我认为我正在接近我想要的)
【问题讨论】:
-
无法理解“第一次购买基于第二次查询指定的期限”的问题?
-
请看我的编辑#2,谢谢
标签: mysql prestashop