0

我使用以下查询来查找重复项:

SELECT userID,
COUNT(userID) AS NumOccurrences
FROM userDepartments
GROUP BY userID
HAVING ( COUNT(userID) > 1 )

然后我尝试添加一个内部连接,以便我可以看到匹配的用户名,这些用户名存储在不同的表中。

SELECT userDepartments.userID, users.firstname, users.lastname,
COUNT(userID) AS NumOccurrences
FROM userDepartments INNER JOIN users ON userDepartments.userID = users.userID
GROUP BY userID
HAVING ( COUNT(userID) > 1 )

但它给了我一个错误,说 users.firstname 不是某个聚合函数或其他东西的一部分......

有谁知道我如何获得计数,只显示具有多个部门的用户,并从另一个表中获取名字和姓氏,这样我就可以获得分配了多个部门的用户名列表?

编辑:这是最终为我工作的查询......

SELECT     firstname, lastname
FROM         tbl_users
WHERE     (userID IN
                          (SELECT     userID
                            FROM          tbl_usersDepts
                            GROUP BY userID
                            HAVING      (COUNT(userID) > 1)))
4

8 回答 8

5

我会稍微重新排列查询....

SELECT
    duplicates.NumOccurrences,
    duplicates.userID,
    users.firstname,
    users.lastname
FROM (
    SELECT
        userID,
        COUNT(userID) AS NumOccurrences
    FROM userDepartments
    GROUP BY userID
    HAVING COUNT(userID) > 1
) duplicates
INNER JOIN users ON duplicates.userID = users.userID
于 2009-02-06T20:58:33.890 回答
2

SQL 引擎不知道每个用户 ID 只有一个用户名,因此您必须按名字和姓氏以及用户 ID 进行分组。

SELECT userDepartments.userID, users.firstname, users.lastname,
COUNT(userID) AS NumOccurrences
FROM userDepartments INNER JOIN users ON userDepartments.userID = users.userID
GROUP BY userID, users.firstname, users.lastname
HAVING ( COUNT(userID) > 1 )

如果您不按名字和姓氏进行分组,那么引擎不知道如果它为给定的用户 ID 获得多个名字的值时应该做什么。通过告诉它按所有三个值分组,它知道如果每个用户标识多于一行,它应该返回所有这些行。即使这不应该发生,在这种情况下,引擎也不够聪明,无法自行决定。

你也可以这样做:

SELECT users.userId, users.firstname, users.lastname, departments.NumOccurrences
FROM users INNER JOIN (
     SELECT userId, count(userId) as NumOccurrences 
     FROM userDepartments 
     GROUP BY userID 
     HAVING ( COUNT(userID) > 1 )
) departments ON departments.userID = users.userID
于 2009-02-06T20:54:03.057 回答
1

按所有三个分组:userDepartments.userID、users.firstname 和 users.lastname

于 2009-02-06T20:53:42.043 回答
0

您需要在 GROUP BY 子句中包含 user.firstname 和 users.lastname - 因为它们不是聚合值(请注意,MySQL 确实支持您在查询中使用的语法,但它不是标准的)。

于 2009-02-06T20:54:12.353 回答
0

如果您执行“分组依据”,则“选择”部分中的所有内容都需要:

  1. 在“分组依据”条款中提及或

  2. 聚合函数的结果(如 count())

于 2009-02-06T20:54:45.050 回答
0

我会这样做(在 Oracle 中,以防万一这在您的系统中不起作用):

SELECT users.userID, users.firstname, users.lastname, NumOccurrences
  FROM users
       INNER JOIN (
         SELECT userID, COUNT(userID) AS NumOccurrences
           FROM userDepartments
           GROUP BY userID
           HAVING ( COUNT(userID) > 1 )
       ) d
       ON d.userID = users.userID
于 2009-02-06T20:59:38.833 回答
0

我看到很多关于将您的姓名字段添加到 group by 的好注释。不过,我想我会这样做:

SELECT Users.*, dups.NumOccurances, ud.DepartmentName
FROM Users
INNER JOIN
  (
    SELECT userID, COUNT(userID) AS NumOccurrences
    FROM userDepartments
    GROUP BY userID
    HAVING ( COUNT(userID) > 1 )
  ) dups ON dups.userID = Users.UserID
INNER JOIN userDepartments ud ON ud.UserID=Users.UserID
ORDER BY Users.LastName, Users.FirstName, Users.UserID

采用这种方法的一个原因是,它可以更轻松地返回并获取您可能想要的任何其他信息。

于 2009-02-06T20:59:45.807 回答
0

将您的 user.Firstname 和 User.lastname 添加到您的 group by 子句

于 2009-02-06T21:00:13.107 回答