2014-11-04 136 views
0

對SQL仍然陌生。我的目標是找到最後一次標記事件並更新每個用戶的最後一個會話列。我創建了一個能夠查找數據庫中每個用戶的最後時間戳的查詢。我希望再根據property_user_idSQL - 基於來自另一查詢的值更新列

更新property_last_session_date我目前正在運行的這關sqlite3的所有3列被定義爲varchar(255)

這裏是我的代碼,我試圖運行。

UPDATE tb1 
SET 
    tb1.property_last_session_date = tt1.property_timestamp 
FROM tableEvents tb1 
JOIN 
    (SELECT tb2.property_user_id, MAX(tb2.property_timestamp) 
    FROM tableEvents tb2 
    GROUP BY tb2.property_user_id) tt1 
ON tb1.property_user_id = tt1.property_user_id 

謝謝你的幫助!

回答

0
UPDATE tb1 
SET tb1.property_last_session_date = 
    (SELECT tt1.property_timestamp 
    FROM (SELECT tb2.property_user_id, MAX(tb2.property_timestamp) as property_timestamp 
      FROM tableEvents tb2 
      GROUP BY tb2.property_user_id) tt1 
    WHERE tb1.property_user_id = tt1.property_user_id); 

它被稱爲相關子查詢,您可以在SELECT,UPDATE,DELETE中使用它。

請注意,此子查詢是針對tb1的每一行執行的。

但是,MySQL應該足夠聰明,只能執行一次tt1。

該查詢將更新tb1中的所有行。可能有一些問題與行,其中tb1.property_user_id爲空(tb1.property_last_session_date將被設置爲NULL)

UPDATE tb1 
SET property_last_session_date = 
    (SELECT prop_time 
    FROM (SELECT property_user_id as user_id, MAX(property_timestamp) as prop_time 
      FROM tableEvents tb2 
      GROUP BY property_user_id) tt1 
    WHERE tt1.user_id = property_user_id); 
+0

嗨Multisync的,我想你上面的語句,並獲得了「」語法錯誤。我正在使用SQLite Expert Personal在數據庫上運行查詢。 – ETam 2014-11-05 01:00:40

+0

@ETam也許問題是「MAX(tb2.property_timestamp)property_timestamp」。我在最大和別名 – Multisync 2014-11-05 05:38:15

+0

之間添加了AS,不幸的是它沒有工作。仍然得到相同的語法錯誤? – ETam 2014-11-05 18:08:15