2017-03-03 39 views
0

我有一個表在MySQL數據庫中,如:(簡化,以使我的觀點)mysql的連接表,只返回基於時間戳比較行

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

而一個又一個具有一個與表格中的許多關係

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 
      ) 

我要的是零行返回,如果每個家長都爲具有時間戳的ITEM>比(UNIX_TIMESTAMP - EXPIRE),並對每個項目的單個記錄沒有一個。

卡住 - 任何幫助將不勝感激!

編輯 - 基於下面這個答案是工作查詢 - 我需要的是這裏包含沒有沒有一個項目比有效期限並標記它們進行批處理更新項目的結果。

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 

) 

回答

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) 
    ) 
+0

感謝這把我領到了正確的方向 - 最終結果的編輯 – bsautner

+0

你猜對了,你也可以通過在子選擇擺脫秩序。它沒有任何效果,並會使您的查詢更快。 – Anand