mysql在一个表中获取行,其中一个表中的日期为一年但不是另一个表

时间:2016-12-19 10:32:35

标签: mysql select

我在这里找不到处理我的问题类型的回复,但是如果我有事先道歉。

我有两张桌子:客户&订单。

我需要能够选择2015年至少有一个订单但2016年没有订单的所有客户。

我可以通过

获得2015年订单的任何客户
SELECT * 
  FROM clients AS t1 
  LEFT 
  JOIN orders AS t2 
    ON t2.clientid=t1.clientid 
 WHERE t2.orderdate>='2015-01-01' 
   AND t2.orderdate<='2015-12-31' 
 GROUP 
    BY t1.clientid

但我怎样才能改变这一点,以便消除2016年也有订单的客户?

感谢

2 个答案:

答案 0 :(得分:1)

您可以在2016年使用不包含客户ID的子选项

SELECT * 
  FROM clients AS t1 
  INNER 
  JOIN orders AS t2 
    ON t2.clientid=t1.clientid 
 WHERE t2.orderdate>='2015-01-01' 
   AND t2.orderdate<='2016-12-31' 
   AND t1.clientid not in (select clientid from  
                          orders 
                          where orderdate>='2016-01-01'  AND  orderdate<='2016-12-31'  )

你正在使用group by without aggreation函数(最终你应该使用distinct with explict column name)

答案 1 :(得分:0)

我建议使用NOT IN在2016年过滤订单客户。我也会使用YEAR函数:

SELECT * 
  FROM clients AS t1 
  INNER JOIN orders AS t2 
    ON t2.clientid=t1.clientid 
WHERE YEAR(t2.orderdate)=2015
  AND t1.clientid NOT IN (
    SELECT clientid FROM orders sub
    WHERE YEAR(sub.orderdate)=2016
  )