我在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
)
答案 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)
)