2014-11-04 93 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