MySQL:在我的User表中查找重复的名称

时间:2011-04-03 20:14:00

标签: mysql sql

我想在我的用户表中找到名称至少出现两次的所有用户。 'email'是一个独特的字段,但'firstName'和'lastName'的组合不一定是唯一的。

到目前为止,我已经提出了以下查询,这是非常慢的,我甚至不确定它是否正确。请让我知道一个更好的方法来重写这个。

SELECT CONCAT(u2.firstName, u2.lastName) AS fullName
FROM cpnc_User u2
WHERE CONCAT(u2.firstName, u2.lastName) IN (

SELECT CONCAT(u2.firstName, u2.lastName) AS fullNm
FROM cpnc_User u1
GROUP BY fullNm
HAVING COUNT(*) > 1

)

另外,请注意上面的内容返回至少出现两次的名称列表(我想是这样的),但我真正想要的是这些名称的所有用户“id”字段的完整列表。因此,每个名称至少出现两次,将与至少两个主键“id”字段相关联。

感谢您的帮助! 约拿

5 个答案:

答案 0 :(得分:7)

SELECT u.*
FROM cpnc_User u JOIN
(
    SELECT firstName, lastName
    FROM cpnc_User
    GROUP BY firstName, lastName
    HAVING COUNT(*) > 1
) X on X.firstName = u.firstName AND x.lastName = u.lastName
ORDER BY u.firstName, u.lastName

无需组成连接字段,只需单独使用2个字段

答案 1 :(得分:3)

SELECT u.id, u.firstName, u.lastName
FROM cpnc_User u, (
  SELECT uc.firstName, uc.lastName 
  FROM cpnc_User uc 
  GROUP BY uc.firstName, uc.lastName 
  HAVING count(*) > 1
) u2
WHERE (
  u.firstName = u2.firstName
  AND u.lastName = u2.lastName
)

答案 2 :(得分:2)

SELECT u.id
     , CONCAT(u.firstName, ' ', u.lastName) AS fullname
FROM cpnc_User u
  JOIN 
  ( SELECT min(id) AS minid
         , firstName
         , lastName
    FROM cpnc_User 
    GROUP BY firstName, lastName
    HAVING COUNT(*) > 1
  ) AS grp
  ON u.firstName = grp.firstName
    AND u.lastName = grp.lastName
  ORDER BY grp.minid
         , u.id 

ORDER BY grp.minid确保具有相同名字和姓氏的用户在输出中保持组合在一起。

答案 3 :(得分:2)

为了实验,我创建了一个简单的表,其中包含两列用户ID和名称。我插入了一堆记录,包括一些重复记录。然后运行此查询:

SELECT
count(id) AS count,
group_concat(id) as IDs
FROM
test
GROUP BY
`name`
ORDER BY
count DESC

它应该给你这样的结果:

+-------+----------+
| count | IDs      |
+-------+----------+
|     4 | 7,15,4,1 | 
|     2 | 2,8      | 
|     2 | 6,13     | 
|     2 | 14,9     | 
|     1 | 11       | 
|     1 | 10       | 
|     1 | 3        | 
|     1 | 5        | 
|     1 | 17       | 
|     1 | 12       | 
|     1 | 16       | 
+-------+----------+

您需要使用其他内容过滤掉以后的结果。

答案 4 :(得分:1)

好的,你正在进行连接,然后对此进行比较,这实际上意味着数据库将不得不对数据库的每一行做一些事情。

稍微不同的方法,你分别持有姓氏和名字。因此,首先选择所有出现姓氏的实例>在您的数据库中有一次。现在,这已经大大减少了人口。

现在,您可以对名字进行比较,找出匹配的位置。