Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据日期查找差异_Mysql - Fatal编程技术网

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()