mysql连接表,仅根据时间戳比较返回行

时间:2017-03-03 15:53:04

标签: mysql sql

我在mysql数据库中有一个表,如:(简化以表达我的观点)

PARENT
ID | EXPIRE | ITEM
0  | 1000   | FOO
1  | 2000   | BAR

另一个与表A有一对多关系的人

ITEMS
    ID | FK | TIMESTAMP 
    0  | 0  | 1488555058 
    1  | 0  | 1488555059
    2  | 0  | 1488555060       

考虑使用当前时间戳的新值连续填充ITEMS表。我想查询数据库并仅返回其中ITEMS表不包含带有TIMESTAMP> = CURRENT_TIME - EXPIRE_TIME的记录的记录 - 因此结果将只是自EXPIRE时间过去以来未收到新ITEM的PARENT。

我写了这个没有用的东西:

   select P.ID
    from PARENT as P
    JOIN     ITEMS as I
    ON       I.FX =
             (
             SELECT  I2.FK
             FROM    ITEMS as I2
             WHERE   P.ID = I2.FK
             AND  ((((UNIX_TIMESTAMP()* 1000) - I2.TIMESTAMP)))  > P.EXPIRE
             ORDER BY TIMESTAMP DESC
             limit 1
             )

我想要的是,如果每个PARENT作为具有TIMESTAMP>的ITEM,则返回零行。比(UNIX_TIMESTAMP - EXPIRE)和没有一个的每个ITEM的单个记录。

坚持 - 任何帮助将不胜感激!

编辑 - 根据下面的答案,这是工作查询 - 我需要的是一个结果,其中包含的项目没有项目更新而不是过期时间标记它们以进行批处理。

UPDATE PARENT P
SET BATCHID = ?
where not exists(
    select 1 from ITEMS V
    WHERE   V.FK = P.ID
    AND ((((UNIX_TIMESTAMP() * 1000) -  V.TIMESTAMP) / 1000) < P.EXPIRE)
    AND P.BATCHID is NULL
    ORDER BY P.PROCESSEDTIMESTAMP ASC

)

1 个答案:

答案 0 :(得分:2)

这是一个令人困惑的连接声明。我会像这样使用not exists

select *
from Parent as p
where not exists (
    select 1
    from Items
    where FK = p.ID
    and TIMESTAMP  > ((UNIX_TIMESTAMP()* 1000) - p.EXPIRE)
    )