我在以下位置有2张桌子: 用户(user_id,fname,lname,部门)和时钟(id,punchType,punchTime,注释,user_id)。
下面的SQL查询为某些记录拉2行,我不知道为什么。任何见解都会有所帮助。
SELECT user.user_id, user.fname, user.lname, user.department, punchType, punchTime, comment
FROM user
INNER JOIN (
SELECT *
FROM clock
WHERE punchTime IN (
SELECT MAX(punchTime)
FROM clock
GROUP BY user_id
)
) AS a
ON user.user_id = a.user_id
答案 0 :(得分:1)
因为不同的用户可以拥有相同的punch
时间。一个用户的打卡时间可能是另一个用户的最大打卡时间。这是一种解决方法:
SELECT *
FROM clock
WHERE (user_id, punchTime) IN (
SELECT user_id, MAX(punchTime)
FROM clock
GROUP BY user_id
);
这也可以通过相关子查询和其他方法解决。
答案 1 :(得分:0)
您会注意到,当单独使用punchTime进行子查询时,最终每个用户的记录会重复。如果用户的打卡时间中的任何一个与最大打卡时间匹配,则会发生这种情况,他们将停留在该设置中。因此,如果用户的最大时间与其他人的最大时间相匹配,或者用户有两条以上的记录表示他们自己的最大打孔时间,则您将时钟中的同一user_id的多行与用户表连接起来。
例如:
SELECT
user_id,
MAX(punchTime) as real_max_time,
COUNT(1) as dupe_count,
COUNT(DISTINCT(punchTime)) as unique_punchTimes
COUNT(DISTINCT(punchType)) as unique_punchTypes
FROM clock
WHERE punchTime IN (
SELECT MAX(punchTime)
FROM clock
GROUP BY user_id
)
GROUP BY
user_id
HAVING COUNT(1) > 1
否则,您的用户表中可能有重复的user_id。也许一个用户曾经在多个部门工作?或更改名称?
使用以下内容查找重复的user_id:
SELECT
user_id,
COUNT(1) as duplicate_user_count
FROM user
GROUP BY user_id
HAVING COUNT(1) >1
将所有内容放回一起-查找发生重复的位置,然后将其他列添加至您关心的问题,一旦解决:
SELECT
users.user_id,
users.dupe_users,
max_time.distinct_punchtimes,
max_time.distinct_punchtypes,
max_time.max_punchTime
FROM (
SELECT
user_id,
COUNT(1) as dupe_users
FROM user
GROUP BY
user_id
) as users
INNER JOIN (
SELECT
user_id,
COUNT(1) as clock_rows,
COUNT(DISTINCT(punchTime)) as distinct_punchtimes,
COUNT(DISTINCT(punchType)) as distinct_punchtypes,
MAX(punchTime) max_punchTime
FROM clock
GROUP BY user_id
) as max_time
ON users.user_id = max_time.user_id