从Punch和Users表查询全量用户登录登出记录的SQL问题
解决方案
你的问题出在不必要的GROUP BY子句——GROUP BY是用来对数据做聚合统计(比如取每日首次/末次打卡)的,但你需要展示所有用户的每一条登录登出记录,完全不需要分组操作。
正确的SQL查询语句
SELECT u.User_Name AS 用户名, p.Punch_In_Time AS 登录时间, p.Punch_Out_Time AS 登出时间 FROM Users u INNER JOIN Punch p ON u.UserID = p.UserId ORDER BY u.User_Name, p.Punch_In_Time;
关键说明
- 用
INNER JOIN ... ON替代原来的WHERE连接条件,这是SQL关联表的标准写法,可读性更强。 - 移除
GROUP BY子句:因为你需要的是所有打卡明细,分组会把同一用户同一日期的多条记录合并成一条,自然丢失中间的操作记录。 - 排序逻辑保留:按用户名排序分组、登录时间升序排列,完全符合你要展示所有操作记录的需求。
补充(若需聚合统计场景)
如果后续需要统计用户每日的首次登录/末次登出,才需要用到GROUP BY配合聚合函数,示例如下:
SELECT u.User_Name AS 用户名, DATE(p.Punch_In_Time) AS 日期, MIN(p.Punch_In_Time) AS 当日首次登录, MAX(p.Punch_Out_Time) AS 当日末次登出 FROM Users u INNER JOIN Punch p ON u.UserID = p.UserId GROUP BY u.User_Name, DATE(p.Punch_In_Time) ORDER BY u.User_Name, DATE(p.Punch_In_Time);
内容的提问来源于stack exchange,提问作者Chetan
相关产品推荐
相关产品推荐

