SQL, возвращающий двойные строки - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть 2 таблицы: users (user_id, fname, lname, отдела) и clock (id, punchType, punchTime, comment, 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

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы заметите, что когда вы отправляете запрос только с помощью 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
0 голосов
/ 24 сентября 2018

Поскольку разные пользователи могут иметь одинаковое время punch.Время удара одного пользователя может быть максимальным временем удара другого пользователя.Вот одно исправление:

        SELECT *
        FROM clock
        WHERE (user_id, punchTime) IN (
                SELECT user_id, MAX(punchTime) 
                FROM clock
                GROUP BY user_id
               );

Это также можно исправить с помощью коррелированных подзапросов и других методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...