编写MySQL查询设置用户started_at字段:按晋升历史赋值或取创建时间
解决方案
要实现更新users表的started_at字段需求,可以通过子查询获取用户最后一次晋升时间,再结合LEFT JOIN和COALESCE函数完成条件赋值,具体SQL语句如下:
UPDATE users u LEFT JOIN ( SELECT uuid, MAX(updated_at) AS last_promote_time FROM history WHERE promoted = 1 GROUP BY uuid ) h ON u.uuid = h.uuid SET u.started_at = COALESCE(h.last_promote_time, u.created_at);
语句说明
- 子查询部分:从
history表中筛选出所有晋升记录(promoted=1),按uuid分组后取每组最大的updated_at,即每个用户最后一次晋升的时间。 LEFT JOIN:确保所有users表的用户都能被匹配到,即使该用户没有任何晋升记录。COALESCE函数:如果子查询返回了last_promote_time(即用户有晋升记录),则用该值更新started_at;如果子查询无结果(无晋升记录),则使用用户的created_at值。
验证逻辑(可选)
如果需要先验证更新结果而不实际修改数据,可以用查询语句预览:
SELECT u.uuid, u.promoted, COALESCE(h.last_promote_time, u.created_at) AS new_started_at, u.started_at AS old_started_at, u.created_at FROM users u LEFT JOIN ( SELECT uuid, MAX(updated_at) AS last_promote_time FROM history WHERE promoted = 1 GROUP BY uuid ) h ON u.uuid = h.uuid;
内容的提问来源于stack exchange,提问作者no746
相关产品推荐
相关产品推荐

