我使用以下查询来查找重复项:
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)))
答案 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)
如果您执行“分组依据”,则“选择”部分中的所有内容都必须为:
在“group by”条款或
聚合函数的结果(如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子句