Mysql选择去年但不是今年的活动

时间:2013-07-09 00:13:42

标签: php mysql inner-join self-join

我需要一些查询方向。

我有一张订单表。它包含以下列(等等)

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?我对这些并不十分熟悉,并且很难找到相关的例子。谢谢你的帮助!

3 个答案:

答案 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'解决方案)的信息。