我有一個名爲passive
的表,而不是每個用戶包含時間戳事件的列表。我想填充屬性duration
,這對應於當前行事件與此用戶完成的下一個事件之間的時間。如何在嵌套子查詢中引用主查詢的表?
我嘗試以下查詢:
UPDATE passive as passive1
SET passive1.duration = (
SELECT min(UNIX_TIMESTAMP(passive2.event_time) - UNIX_TIMESTAMP(passive1.event_time))
FROM passive as passive2
WHERE passive1.user_id = passive2.user_id
AND UNIX_TIMESTAMP(passive2.event_time) - UNIX_TIMESTAMP(passive1.event_time) > 0
);
這將返回錯誤信息Error 1093 - You can't specify target table for update in FROM
。爲了規避這個限制,我試圖遵循https://stackoverflow.com/a/45498/395857中給出的結構,它使用FROM子句中的嵌套子查詢來創建一個隱式臨時表,這樣它就不會被視爲同一個表,再次更新:
UPDATE passive
SET passive.duration = (
SELECT *
FROM (SELECT min(UNIX_TIMESTAMP(passive2.event_time) - UNIX_TIMESTAMP(passive.event_time))
FROM passive, passive as passive2
WHERE passive.user_id = passive2.user_id
AND UNIX_TIMESTAMP(passive2.event_time) - UNIX_TIMESTAMP(passive1.event_time) > 0
)
AS X
);
然而,passive
表中嵌套子查詢不指同一passive
作爲主查詢。因此,所有行都具有相同的passive.duration
值。如何在嵌套子查詢中引用主查詢的passive
? (或者是有一些替代的方法來構建這樣的查詢?)
非常感謝,它確實繞過了錯誤1093.但是,不('從被動方式選擇*)'減慢查詢? (被動表是6 GB)你有任何建議來加快查詢? –
@FranckDernoncourt從查詢它看起來像你有多個條目相同的用戶ID,所以你可以嘗試'選擇最大(event_time),user_id從被動組user_id' ...我認爲這將減少表的大小一點點。 ... –
Thanks,'Max(event_time)'會改變結果,但是'SELECT event_time,user_id from passive] Passive2'會降低運行時間(約10%)。我有種感覺這種操作不適合SQL。 –