任何人都可以告诉我为什么我的SQL查询不起作用(见详情)?

时间:2009-02-06 20:50:53

标签: sql count inner-join

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

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不是某些聚合函数或其他东西的一部分......

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

编辑:这就是为我工作的终结...

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

8 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

SQL引擎不知道每个用户标识只有一个用户名,因此您必须按名字和姓氏以及用户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的多个firstname值,引擎就不知道应该做什么。通过告诉它按所有三个值进行分组,它知道如果每个userid有多个行,它应该返回所有这些行。即使这不应该发生,在这种情况下引擎也不够聪明,无法自行决定。

你也可以这样做:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

  1. 在“group by”条款或

  2. 中提及
  3. 聚合函数的结果(如count())

答案 5 :(得分: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

答案 6 :(得分:0)

我看到很多关于将你的名字字段添加到组中的好注意事项。我想我会这样做,但是:

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

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

答案 7 :(得分:0)

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