MySQL-查找长期以来老客户与新客户的订单
我有一个订单表,其中包含订单id、客户电子邮件地址和购买日期。我想编写一个SQL查询,该查询将为表中的每一行添加一个名为“repeat\u order\u count”的新字段,该字段显示该客户之前订购了多少次,包括该订单 例如,如果John在此订单之前订购了一次,则此订单的重复订单计数将为2,或者换句话说,这是John第二次订购。我为John遇到的下一个订单行将有一个3,依此类推。这将允许我创建一个折线图,显示一段时间内回头客下的订单数量。我现在可以转到过去的某个特定时间,计算出在该时间段内回头客下了多少订单:MySQL-查找长期以来老客户与新客户的订单,mysql,sql,Mysql,Sql,我有一个订单表,其中包含订单id、客户电子邮件地址和购买日期。我想编写一个SQL查询,该查询将为表中的每一行添加一个名为“repeat\u order\u count”的新字段,该字段显示该客户之前订购了多少次,包括该订单 例如,如果John在此订单之前订购了一次,则此订单的重复订单计数将为2,或者换句话说,这是John第二次订购。我为John遇到的下一个订单行将有一个3,依此类推。这将允许我创建一个折线图,显示一段时间内回头客下的订单数量。我现在可以转到过去的某个特定时间,计算出在该时间段内回
SELECT
*
FROM orders
WHERE repeat_order_count > 1
WHERE date_purchased = January 2014 --(simplifying things here)
我现在还能够确定客户何时成为回头客
我想不出解决这个问题的方法。或者可能有一种更简单的方法可以做到这一点?当您插入到orders表中时,对于您的
OrderCount
的列,您使用一个相关联的子查询。
例如:
请注意,在处理第二份订单时,您不会添加该字段,该字段将已经存在,您只需填充它。当您插入订单表时,对于您的
OrderCount
列,您使用一个相关子查询。
例如:
请注意,在处理第二份订单时,您不会添加该字段,该字段将已经存在,您只需填充它。当您插入订单表时,对于您的
OrderCount
列,您使用一个相关子查询。
例如:
请注意,在处理第二份订单时,您不会添加该字段,该字段将已经存在,您只需填充它。当您插入订单表时,对于您的
OrderCount
列,您使用一个相关子查询。
例如:
请注意,在处理第二个订单时,您不会添加字段,该字段已经存在,您只需填充它。检索指定结果的一种方法是在选择列表中使用相关子查询。这假设客户标识符是
客户\u电子邮件\u地址
,购买日期
是日期时间
或时间戳
(或其他规范格式),并且同一客户没有重复的值(也就是说,客户没有两个或多个具有相同购买日期值的订单。)
有了这个索引,我们希望EXPLAIN
能够显示外部查询使用的索引,满足ORDER by
(在Extra
列中没有“usingfilesort”),并作为覆盖索引(在Extra
列中没有对底层表中的页面进行查找,“usingindex”)
我给出的答案只演示了一种方法。也可以使用连接模式返回等效结果,例如:
SELECT s.orders_id
, s.customers_email_address
, s.date_purchased
, COUNT(p.orders_id)
FROM orders s
JOIN orders p
ON p.customers_email_address = s.customers_email_address
AND p.date_purchased <= s.date_purchased
GROUP
BY s.customers_email_address
, s.date_purchased
, s.orders_id
ORDER
BY s.customers_email_address
, s.date_purchased
, s.orders_id
注意:索引中列的顺序很重要。使用该索引,我们可以执行以下操作:
SELECT s.orders_id
, s.customers_email_address
, s.date_purchased
, COUNT(p.orders_id)
FROM orders s
JOIN orders p
ON p.customers_email_address = s.customers_email_address
AND p.orders_id <= s.orders_id
GROUP
BY s.customers_email_address
, s.orders_id
ORDER
BY s.customers_email_address
, s.orders_id
选择s.orders\u id
,s.客户\电子邮件\地址
,s.购买日期
,计数(p.orders\u id)
从命令
联合订单p
在p.customers\u email\u address=s.customers\u email\u address上
和p.orders\u id检索指定结果的一种方法是在选择列表中使用相关子查询。这假设客户标识符是customers\u email\u address
,并且date\u purchased
是DATETIME
或时间戳
(或其他规范格式),并且同一客户没有重复的值(也就是说,该客户没有两个或多个具有相同购买日期的订单)
有了这个索引,我们希望EXPLAIN
能够显示外部查询使用的索引,满足ORDER by
(在Extra
列中没有“usingfilesort”),并作为覆盖索引(在Extra
列中没有对底层表中的页面进行查找,“usingindex”)
我给出的答案只演示了一种方法。也可以使用连接模式返回等效结果,例如:
SELECT s.orders_id
, s.customers_email_address
, s.date_purchased
, COUNT(p.orders_id)
FROM orders s
JOIN orders p
ON p.customers_email_address = s.customers_email_address
AND p.date_purchased <= s.date_purchased
GROUP
BY s.customers_email_address
, s.date_purchased
, s.orders_id
ORDER
BY s.customers_email_address
, s.date_purchased
, s.orders_id
注意:索引中列的顺序很重要。使用该索引,我们可以执行以下操作:
SELECT s.orders_id
, s.customers_email_address
, s.date_purchased
, COUNT(p.orders_id)
FROM orders s
JOIN orders p
ON p.customers_email_address = s.customers_email_address
AND p.orders_id <= s.orders_id
GROUP
BY s.customers_email_address
, s.orders_id
ORDER
BY s.customers_email_address
, s.orders_id
选择s.orders\u id
,s.客户\电子邮件\地址
,s.购买日期
,计数(p.orders\u id)
从命令
联合订单p
在p.customers\u email\u address=s.customers\u email\u address上
和p.orders\u id检索指定结果的一种方法是在选择列表中使用相关子查询。这假设客户标识符是customers\u email\u address
,并且date\u purchased
是DATETIME
或时间戳
(或其他规范格式),并且同一客户没有重复的值(也就是说,该客户没有两个或多个具有相同购买日期的订单)
有了这个索引,我们希望EXPLAIN
能够显示外部查询使用的索引,满足ORDER by
(在Extra
列中没有“usingfilesort”),并作为覆盖索引(在Extra
列中没有对底层表中的页面进行查找,“usingindex”)
我给出的答案只演示了一种方法。也可以使用连接模式返回等效结果,例如:
SELECT s.orders_id
, s.customers_email_address
, s.date_purchased
, COUNT(p.orders_id)
FROM orders s
JOIN orders p
ON p.customers_email_address = s.customers_email_address
AND p.date_purchased <= s.date_purchased
GROUP
BY s.customers_email_address
, s.date_purchased
, s.orders_id
ORDER
BY s.customers_email_address
, s.date_purchased
, s.orders_id
注意:索引中列的顺序很重要。使用该索引,我们可以执行以下操作:
SELECT s.orders_id
, s.customers_email_address
, s.date_purchased
, COUNT(p.orders_id)
FROM orders s
JOIN orders p
ON p.customers_email_address = s.customers_email_address
AND p.orders_id <= s.orders_id
GROUP
BY s.customers_email_address
, s.orders_id
ORDER
BY s.customers_email_address
, s.orders_id
选择s.orders\u id
,s.客户\电子邮件\地址
,s.购买日期
,计数(p.orders\u id)
从命令