SQL返回双行

时间:2018-09-24 16:39:30

标签: sql mysqli

我在以下位置有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

2 个答案:

答案 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