我有一张表产品表,其中的区域可以定期更改。仅当区域更改时,我才需要查找产品。 我的数据看起来像这样
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
答案 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
关键字。