打开购物车 - MySQL 查询客户列表

Open cart - MySQL query on customer list

我正在尝试获取在过去 9 个月内未购买但在 9-18 个月前购买过的客户列表。 下面的查询在本地主机上运行良好,但在具有 MariaDB 的服务器上运行不正常。 SELECT MAX(o.date_modified) GROUP BY o.email 是导致服务器错误的查询。

任何人都可以在 MariaDB 上重写可以 运行 的语句。我的查询是

SELECT 
o.firstname AS FirstName, 
o.lastname AS LastName,  
o.date_modified AS OrderDate, 
o.order_id AS OrderID, 
op.name AS ProductName, 
op.model AS ProductModel, 
p.sku AS ProductSKU 

FROM `store_order` AS o 
JOIN `store_order_product` op 
    ON o.order_id=op.order_id 
JOIN `store_product` AS p 
    ON op.product_id = p.product_id 

WHERE o.order_status_id = '3' 
AND TIMESTAMPDIFF( MONTH , (SELECT MAX(o.date_modified) GROUP BY o.email), CURDATE( ) ) 
BETWEEN 9 AND 18 
ORDER BY o.date_modified DESC

您需要correlate sub-query

SELECT o.firstname AS FirstName 
       .......
FROM   store_order AS o 
       JOIN store_order_productop 
         ON o.order_id = op.order_id 
       JOIN store_productas p 
         ON op.product_id = p.product_id 
WHERE  o.order_status_id = '3' 
       AND Timestampdiff(month, (SELECT Max(o1.date_modified) 
                                 FROM   store_order o1 
                                 WHERE  o1.email = o.email), Curdate()) BETWEEN 9 AND 18 
ORDER  BY o.date_modified DESC 

这对我有用

SELECT 
o.firstname AS FirstName, 
o.lastname AS LastName,  
o.date_modified AS OrderDate, 
o.order_id AS OrderID, 
op.name AS ProductName, 
op.model AS ProductModel, 
p.sku AS ProductSKU 

FROM `store_order` AS o 
JOIN `store_order_product` op 
    ON o.order_id=op.order_id 
JOIN `store_product` AS p 
    ON op.product_id = p.product_id 

WHERE o.order_status_id = '3' 
AND TIMESTAMPDIFF( MONTH , (SELECT MAX(o.date_modified) FROM `store_order` GROUP BY o.email), CURDATE() ) 
BETWEEN 9 AND 18 
ORDER BY o.date_modified DESC

MySQL Workbench 在 GROUP BY

之前发现错误
SELECT ...
    GROUP BY email
    HAVING MAX(date_modified) > NOW() - 18 MONTH  -- bought in last 18 months
       AND MAX(date_modified) < NOW() -  9 MONTH  -- but not in the last 9

也就是说,不需要 JOIN 也不需要子查询。