2011-11-23 120 views
0

我有兩個表,任務和操作。動作有兩列,created_at和updated_at。任務有一個列started_at根據日期選擇行

我怎麼可以這樣做

SELECT MAX(UNIX_TIMESTAMP(tasks.started_at)) AS started_at, action . * 
FROM tasks, action 
WHERE UNIX_TIMESTAMP(action.created_at) > started_at 
OR UNIX_TIMESTAMP(action.updated_at) > started_at 

試圖選擇具有比MAX(tasks.started_at)更大created_at或全部的updated_at行動

+0

''starting_at' a'TIMESTAMP'格式?然後,避免在'WHERE'子句中使用函數,直接比較時間戳,並將MAX(UNIX_TIMESTAMP(tasks.started_at))'改爲'UNIX_TIMESTAMP(MAX(tasks.started_at))'。 – Tadeck

+0

'started_at'是'DATETIME',而不是'TIMESTAMP'。你是什​​麼意思直接比較? – tipu

+0

我的意思是你可以直接比較'TIMESTAMP'值(以及'DATETIME',但是不同日期/時間類型的比較可能因時區問題而變得棘手),而不需要將它們轉換爲Unix紀元。你也可以使用'MAX()'從'TIMESTAMP'和'DATETIME'列中獲取最高和最低值,而不需要將它們轉換爲Unix紀元。 – Tadeck

回答

1
SELECT * FROM actions 
WHERE created_at>(SELECT MAX(started_at) FROM tasks) OR 
     updated_at>(SELECT MAX(started_at) FROM tasks) 

唐不擔心性能,默認情況下MySQL應該緩存SELECT MAX(started_at) FROM tasks的值。如果您有其他配置,請將SQL_CACHE添加到主要查詢:SELECT SQL_CACHE * FROM...