2009-02-06 93 views
0

我用下面的查询来查找重复:任何人都可以告诉我为什么我的SQL查询不起作用(请参阅详细信息)?

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部门,并且还可以从另一个表中获取名字和姓氏,以便我可以获得分配了多个部门的用户名单列表?

编辑:这是由所有三个截至UP为我工作查询...

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

请务必信任向您提供解决方案的最佳答案的人员;即使你最终想出了它。这里有人肯定会给你一个机会。库多兹到解决方案。 – SnapJag 2009-02-06 21:13:21

回答

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 
+0

打了我几秒钟:) – 2009-02-06 20:59:50

+0

啊 - 你也打败了我.. – Eclipse 2009-02-06 21:02:32

1

组:userDepartments.userID,users.firstname和users.lastname

+0

你打我吧... +1 – WildJoe 2009-02-06 21:20:31

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 
0

您需要在您的集团user.firstname和users.lastname BY子句 - 因为他们不是总值(注意,MySQL的实际支持您在查询中使用的语法,但它不是标准的)。

0

如果“按组”做了那么一切都可以“选择”部分要么必须是:

  1. “分组依据”子句中提及或

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

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

原因之一这种方法是,它可以更容易地再回去拿,你可能想要的任何其他信息。

0

将您的user.Firstname和User.lastname添加到您的群组条款

相关问题