【问题标题】:Can anyone show me why my SQL query isn't working (see details)?谁能告诉我为什么我的 SQL 查询不起作用(请参阅详细信息)?
【发布时间】:2010-10-06 01:05:43
【问题描述】:

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

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)))

【问题讨论】:

  • 请务必感谢为您的解决方案提供最佳答案的人;即使你最终想出了它。这里一定有人帮助过你。为解决方案点赞。

标签: sql count inner-join


【解决方案1】:

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

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

【讨论】:

  • 击败我几秒钟 :)
  • 我也是,虽然我能够回过头来稍微区分一下。
  • 假设用户 ID 只有一个名字/姓氏,有人可以解释在子查询中执行此操作并将结果加入用户的优势,而不是先加入用户然后对所有三个字段进行分组吗?
  • 因为您将源数据与源数据的美化完全分开。
  • 我不买那个。如果您需要将另一个字段添加到选择中,请将其添加到 group by 中,这没什么难看的。按用户 ID 分组后,您无需支付更多费用来按其他字段进行分组。
【解决方案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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        1. 在“group by”子句中提到或

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

        【讨论】:

          【解决方案6】:

          我会这样做(在 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
          

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              我看到很多关于将您的姓名字段添加到 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
              

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

              【讨论】:

              • 另外两个人以不到一分钟的时间击败了我。删除我的副本。
              • 其实我觉得还是可以增值的。几分钟后我会有更新。
              猜你喜欢
              • 2013-05-08
              • 1970-01-01
              • 1970-01-01
              • 2010-12-12
              • 1970-01-01
              • 2023-03-24
              • 1970-01-01
              • 1970-01-01
              • 2016-12-26
              相关资源
              最近更新 更多