我想在我的用户表中找到名称至少出现两次的所有用户。 '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”字段相关联。
感谢您的帮助! 约拿
答案 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)
好的,你正在进行连接,然后对此进行比较,这实际上意味着数据库将不得不对数据库的每一行做一些事情。
稍微不同的方法,你分别持有姓氏和名字。因此,首先选择所有出现姓氏的实例>在您的数据库中有一次。现在,这已经大大减少了人口。
现在,您可以对名字进行比较,找出匹配的位置。