1

我需要一些关于查询的方向。

我有一个订单表。它具有以下列(除其他外)

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

4

3 回答 3

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)
于 2013-07-09T00:15:42.940 回答
2

eggyal 的答案会起作用,但它可能会很慢,因为它不能使用索引。假设您在 上有一个索引OrderDate,则以下 self-JOIN 可能会更好:

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
于 2013-07-09T00:23:14.537 回答
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`

还有一些关于如何用子查询重写查询以使用连接查询的信息(@Barmar 的解决方案)。

于 2013-07-09T00:33:38.977 回答