我需要一些查询方向。
我有一张订单表。它包含以下列(等等)
OrderID | OrderDate | CustomerID
我想找到在2012年订购但未在2013年订购的客户。
(实际上我最终会想要更高的精确度(2012年3月但不是2013年订购的客户))
我知道我可以做两个查询 -
"SELECT * FROM TABLE WHERE OrderDate BETWEEN 2012-01-01 AND 2012-12-31"
"SELECT * FROM TABLE WHERE OrderDate BETWEEN 2013-01-01 AND 2013-12-31"
然后分析结果,但似乎应该可以使用纯mysql。
也许是自我加入?还是嵌套的SELECT?我对这些并不十分熟悉,并且很难找到相关的例子。谢谢你的帮助!
答案 0 :(得分:3)
不需要加入;只需在客户分组时过滤订单:
SELECT CustomerID
FROM Orders
GROUP BY CustomerID
HAVING SUM(OrderDate BETWEEN 2012-03-01 AND 2012-03-31)
AND NOT SUM(OrderDate BETWEEN 2013-01-01 AND 2013-12-31)
答案 1 :(得分:2)
eggyal的答案会起作用,但由于无法使用索引,因此可能非常慢。假设您有OrderDate
的索引,以下自我加入可能会更好:
SELECT DISTINCT o1.CustomerID
FROM Orders o1
LEFT JOIN Orders o2
ON o1.CustomerID = o2.CustomerID
AND o2.OrderDate BETWEEN '2013-01-01' AND '2013-12-31 23:59:59'
WHERE o1.Orderdate BETWEEN '2012-01-01' AND '2012-12-31 23:59:59'
AND o2.CustomerID IS NULL
答案 2 :(得分:0)
我的查询更具可读性。只需从2012年的客户中减去2013年的客户。
SELECT `CustomerID`
FROM `d`
WHERE
`OrderDate` BETWEEN '2012-01-01' AND '2012-12-31 23:59:59'
AND `CustomerID` NOT IN
(SELECT `CustomerID`
FROM `d`
WHERE
`OrderDate` BETWEEN '2013-01-01' AND '2013-12-31 23:59:59'
GROUP BY `CustomerID`)
GROUP BY `CustomerID`
还有一些关于如何rewrite query with subquery to query with join(@ Barmar'解决方案)的信息。