打开购物车 - 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
也不需要子查询。
我正在尝试获取在过去 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
也不需要子查询。