MySQL查询日志表两ID字段关联同user表获取对应用户名
错误原因
原SQL的核心问题是没有正确区分user表的两次关联逻辑:user_log表中user_id和updated_by两个字段都要关联user表的user_id主键,分别取被操作用户和操作人的姓名,原写法混淆了关联匹配字段,还在子查询中格式化时间丢失了时分秒,最终导致姓名字段取值错误。
正确SQL实现
SELECT l.user_id AS log_user_id, u_target.name AS log_user_name, l.action, l.changed_date, l.updated_by AS updated_user_id, u_operator.name AS updated_user_name FROM user_log l -- 关联被操作的目标用户 INNER JOIN user u_target ON l.user_id = u_target.user_id -- 关联执行操作的用户 INNER JOIN user u_operator ON l.updated_by = u_operator.user_id ORDER BY l.changed_date ASC;
如果存在日志关联的用户已被删除、需要保留全部日志记录的场景,可以把
INNER JOIN换成LEFT JOIN,避免关联不到用户时整条日志被过滤。
原写法中用DATE_FORMAT(l.changed_date,'%Y-%m-%d')会把时间截断到日期维度,丢失时分秒部分,和预期返回的完整时间格式不符,因此直接取原表的changed_date字段即可。
内容的提问来源于stack exchange,提问作者ugsgknt
相关产品推荐
相关产品推荐

