【问题标题】:Request with two different dates ranges具有两个不同日期范围的请求
【发布时间】:2017-08-30 15:32:22
【问题描述】:

我对 MySQL 提出了两个不同日期范围的请求有一点问题。

我需要有 nb_saleslast_sales 直到 2014 年,但 frequence 仅适用于过去一年。

我想要的结果:

customer_id     |    nb_sales    |   last_sales  |   frequence
---------------------------------------------------------------
Customer ID     | Sales make by  |  How many days|  How many sales
                |  the customer  |  since the    |  has been made
                |                |  last sales?  |  this year?

第 1-3 列在第一个日期范围内:今天到 2014 年
第 4 列在第二个日期范围内:今天到 y-1

所以我尝试了:

  1. 创建一个临时表并插入频率
  2. SELECT customer_idnb_saleslast_salesfrequenceLEFT OUTER JOIN

第一步没问题,但第二步我没有任何结果或错误消息......当我想LEFT OUTER JOIN我的临时表时发生这种情况:

LEFT OUTER JOIN tmp_frequence 
  ON tmp_frequence.client_id = sales_flat_order.customer_id

也许你有更好的主意?

CREATE TEMPORARY TABLE tmp_frequence (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    client_id INT,
    frequence INT,
    PRIMARY KEY (id)
);

INSERT INTO tmp_frequence (client_id, frequence)
SELECT sales_flat_order.customer_id, COUNT(sales_flat_order.entity_id)
FROM sales_flat_order
WHERE sales_flat_order.created_at BETWEEN '2014-05-22 00:00:00' and '2017-07-31 23:59:59'
GROUP BY sales_flat_order.customer_id;

/* ------------------------------  */ 
SELECT  
-- * , 
sales_flat_order.customer_id customer_id,
COUNT(sales_flat_order.entity_id) nb_sales,
DATEDIFF("2017-07-31",DATE_FORMAT(MAX(sales_flat_order_item.created_at),"%Y-%m-%d")) last_sales,
tmp_frequence.frequence frequence

FROM adl_ec.sales_flat_order_item 
LEFT OUTER JOIN sales_flat_order 
  ON sales_flat_order.entity_id = sales_flat_order_item.order_id 
LEFT OUTER JOIN tmp_frequence 
  ON tmp_frequence.client_id=sales_flat_order.customer_id

WHERE sales_flat_order_item.created_at BETWEEN '2014-05-22 00:00:00' and '2017-07-31 23:59:59'
GROUP BY customer_id;

DROP TABLE tmp_frequence ;

【问题讨论】:

  • 我不知道您所说的“暂时性”是什么意思,但是您的 WHERE 子句正在将您的 LEFT JOIN 转换为 INNER JOIN。外部表的条件需要包含在外部联接的ON 子句中,因为在返回外部联接的NULL 结果之后 执行WHERE 子句。除此之外,我真的不知道你想做什么来提供任何帮助......
  • 需要查看数据样本(和预期结果)
  • “不工作”是什么意思?什么是“工作”?这段代码应该做什么?请阅读minimal reproducible example 并采取行动。您需要向我们解释一切的图像,因为我们不知道您在说什么——因为我们不知道。同样“提出具有两个时间性的请求”也没有意义。另请阅读教科书内连接和左连接的定义。
  • 感谢您的帮助,并为我的英语感到抱歉...我已根据您告诉我的信息编辑了帖子。也许现在更清楚了?
  • 您的WHERE 中有一个Space sales_flat_order_item .created_at 对您的实际查询也是如此吗?

标签: mysql sql select inner-join


【解决方案1】:

我终于找到了解决办法。
真的很感谢你的帮助:)

DROP TABLE IF EXISTS tmp_frequence;
CREATE TEMPORARY TABLE tmp_frequence (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    client_id INT,   
    recence INT,
    frequence INT,
    montant INT,
    PRIMARY KEY (id)
);

INSERT INTO tmp_frequence (client_id, frequence)
SELECT sales_flat_order.customer_id, COUNT(sales_flat_order.entity_id)
FROM sales_flat_order
WHERE sales_flat_order.created_at BETWEEN '2016-07-31 00:00:00' and '2017-07-31 23:59:59'
GROUP BY sales_flat_order.customer_id;


INSERT INTO tmp_frequence (client_id, recence, montant)
SELECT
sales_flat_order.customer_id,
DATEDIFF("2017-07-31",DATE_FORMAT(MAX(sales_flat_order_item.created_at),"%Y-%m-%d")) recence,
COUNT(sales_flat_order.grand_total) montant

FROM adl_ec.sales_flat_order_item 
LEFT OUTER JOIN sales_flat_order ON sales_flat_order.entity_id = sales_flat_order_item.order_id 
AND sales_flat_order_item.created_at BETWEEN '2014-05-22 00:00:00' and '2017-07-31 23:59:59'
AND qty_invoiced >0
AND sales_flat_order_item.sku NOT LIKE '%abo%'
AND sales_flat_order.total_qty_ordered < 5

GROUP BY customer_id;

SELECT tmp_frequence.client_id,MAX(tmp_frequence.recence) Recence,MAX(tmp_frequence.frequence) Frequence,MAX(tmp_frequence.montant) Montant
FROM tmp_frequence 
GROUP BY tmp_frequence.client_id; 

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 2021-03-27
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2022-08-17
    相关资源
    最近更新 更多