Mysql 根据日期查找差异
我有一个表产品表,其中区域可以定期更改。我只需要在区域已更改时查找产品。 我的数据是这样的Mysql 根据日期查找差异,mysql,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/2
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
选择A.zones作为newArea,B.zones作为oldArea,A.Addate newdate,B.Addate作为olddate
来自产品A、产品B
其中A.ProductId=B.ProductId
和A.Addate=CURDATE()
B.Addate=DATE\u ADD(CURDATE(),间隔-1天)
和A.zonesB.zones
我们可以编写一个查询,返回今天的行,这些行与昨天的行不匹配。我们可以使用反连接模式
然后,我们还可以将外部联接添加到产品中
,以查找除区域外匹配的行
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()
选择A.zones作为新区域
,C.分区为旧区
,A.addate为newdate
来自产品A
左边
加入产品B
在B.productid=A.productid上
和B.addate=CURDATE()+间隔-1天
B区=A区
左边
加入产品C
关于C.productid=A.productid
和C.addate=CURDATE()+间隔-1天
和C区A区
其中B.productid为NULL
和A.addate=CURDATE()
建议:对于内部联接操作,不要使用老式的逗号语法,而是使用
join
关键字。在上面粘贴数据时,很难读取/可视化数据。你能改成表格形式吗?事实上,分区已经改变了。
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()