根据日期查找差异

时间:2018-08-13 16:20:02

标签: mysql

我有一张表产品表,其中的区域可以定期更改。仅当区域更改时,我才需要查找产品。 我的数据看起来像这样

ProductID 123
zones west
Addate 08/12/2018
rate 5.00

ProductID 123
zones east
Addate 08/12/2018
rate 10.00

ProductID 123
Region west
Addate 08/13/2018
rate 10.00

ProductID 123
zones east
Addate 08/13/2018
rate 10.00

表格格式:

ProductID | zones | Addate | rate
123 | west | 08/12/2018 | 5.00
123 | east | 08/12/2018 | 10.00
123 | west | 08/13/2018 | 10.00
123 | east | 08/13/2018 | 10.00

和下面的查询不应该返回任何数据,因为在最近两天中区域没有更改,但是它带回了两条记录。你能告诉我如何重写吗?

Select A.zones as newArea,B.zones as oldArea ,A.Addate newdate,B.Addate as olddate
from Products A,Products B
where A.ProductId=B.ProductId
and A.Addate=CURDATE()
and B.Addate=DATE_ADD(CURDATE(), INTERVAL -1 DAY)
and A.zones<>B.zones

1 个答案:

答案 0 :(得分:0)

我们可以编写一个查询,该查询返回今天没有昨天匹配行的今天的行。我们可以使用 anti-join 模式。

SELECT A.zones    AS newarea
     , A.addate   AS newdate
 FROM Products A
 LEFT 
 JOIN Products B
   ON B.productid = A.productid
  AND B.addate    = CURDATE() + INTERVAL -1 DAY
  AND B.zones     = A.zones
WHERE B.productid IS NULL 
  AND A.addate = CURDATE() 

然后,我们还可以向Products添加一个外部联接,以查找除区域上以外的其他行...

SELECT A.zones    AS newarea
     , C.zones    AS oldarea
     , A.addate   AS newdate
 FROM Products A
 LEFT 
 JOIN Products B
   ON B.productid = A.productid
  AND B.addate    = CURDATE() + INTERVAL -1 DAY
  AND B.zones     = A.zones
 LEFT
 JOIN Products C
   ON C.productid = A.productid
  AND C.addate    = CURDATE() + INTERVAL -1 DAY
  AND C.zones    <> A.zones
WHERE B.productid IS NULL
  AND A.addate = CURDATE()

建议:放弃旧式逗号语法进行内部联接操作,并使用JOIN关键字。