You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写含SELECT、JOIN、GROUP BY的UPDATE查询,正确填充用户表字段

问题解决:按用户匹配最后推文时间更新字段

你的SQL查询出现所有用户被设置为同一值的原因是没有将主表users和子查询结果通过用户ID关联,导致所有符合条件的用户都匹配到了子查询中的任意一条结果(最终取到同一个max_datetime)。

修改后的查询(基于原语句调整)

直接在原查询的WHERE子句中添加用户ID的关联条件,确保每个用户只匹配自己的最大推文时间:

UPDATE users
SET datetime_modified_at = Grouped.max_datetime
FROM (
    SELECT users.id, MAX(tweets.datetime) AS max_datetime 
    FROM users 
    INNER JOIN tweets ON users.id = tweets.user_id
    WHERE users.datetime_created_at IS NOT NULL AND users.datetime_modified_at IS NULL
    GROUP BY users.id
) AS Grouped
WHERE users.datetime_created_at IS NOT NULL 
  AND users.datetime_modified_at IS NULL
  AND users.id = Grouped.id; -- 关键:建立用户ID的关联

更高效的写法(优化子查询逻辑)

如果数据量较大,建议先从tweets表筛选目标用户的最大推文时间,再关联更新,减少重复关联users表的开销:

UPDATE users
SET datetime_modified_at = Grouped.max_datetime
INNER JOIN (
    SELECT user_id, MAX(datetime) AS max_datetime 
    FROM tweets
    WHERE user_id IN (
        SELECT id FROM users 
        WHERE datetime_created_at IS NOT NULL AND datetime_modified_at IS NULL
    )
    GROUP BY user_id
) AS Grouped ON users.id = Grouped.user_id
WHERE users.datetime_created_at IS NOT NULL 
  AND users.datetime_modified_at IS NULL;

补充说明

如果存在符合条件但没有发布过推文的用户,上述INNER JOIN会跳过这些用户(保持datetime_modified_at为NULL)。如果需要给这类用户设置默认值(比如用户创建时间),可以将INNER JOIN改为LEFT JOIN,并使用COALESCE函数处理:

UPDATE users
SET datetime_modified_at = COALESCE(Grouped.max_datetime, users.datetime_created_at)
LEFT JOIN (
    SELECT user_id, MAX(datetime) AS max_datetime 
    FROM tweets
    WHERE user_id IN (
        SELECT id FROM users 
        WHERE datetime_created_at IS NOT NULL AND datetime_modified_at IS NULL
    )
    GROUP BY user_id
) AS Grouped ON users.id = Grouped.user_id
WHERE users.datetime_created_at IS NOT NULL 
  AND users.datetime_modified_at IS NULL;

内容的提问来源于stack exchange,提问作者Mark Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:35:15