Вы заметите, что когда вы отправляете запрос только с помощью punchTime, вы можете получить дубликаты записей для каждого пользователя.Что происходит, если любой из punchTimes пользователя соответствует максимальному времени удара, они остаются в наборе.Таким образом, если у пользователя есть максимальное время, совпадающее с максимальным временем другого пользователя, или если у пользователя есть две + записи, которые представляют их собственное максимальное время удара, вы будете объединять несколько строк одного и того же 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_ids со следующим:
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