如何检查mysql表中多列的重复项
Posted
技术标签:
【中文标题】如何检查mysql表中多列的重复项【英文标题】:How to check for duplicates in mysql table over multiple columns 【发布时间】:2011-09-21 05:45:13 【问题描述】:我有一张棒球选手的桌子(大约 1000 人),其中包含以下字段:
mysql> describe person;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| firstname | varchar(30) | NO | | NULL | |
| lastname | varchar(30) | NO | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
但我认为有些球员已经加入了两次。如何查看特定名字、姓氏组合出现的次数?
【问题讨论】:
照@RC 说的做,然后添加一个(firstname,lastname)
唯一键
【参考方案1】:
这提供了重复的列表:
SELECT firstname, lastname, COUNT(*)
FROM person
GROUP BY firstname, lastname
HAVING COUNT(*) > 1;
如果您想查看每一行的计数,请删除 having 子句:
SELECT firstname, lastname, COUNT(*)
FROM person
GROUP BY firstname, lastname;
【讨论】:
显然是最好的答案。【参考方案2】:SELECT firstname, lastname, count(id) count
FROM person
WHERE firstname = ?
AND lasttname = ?
GROUP BY firstname, lastname
【讨论】:
只告诉你如果一个特定的人是重复的,而不是哪些人是重复的。 啊,是的,我明白你的意思了。我相信他的意思是 particular,就像 “distinct” 一样,而不是 “specific”。我的评论同样含糊不清,我的意思确实是 "specific" ! :)【参考方案3】:对于按份数递减值排序的列表:
SELECT firstname, lastname, COUNT(*) AS n
FROM person
GROUP BY firstname, lastname
ORDER BY n DESC
HAVING n > 1
HAVING
子句是关键部分 - 有必要过滤结果之后 GROUP BY
子句,因为WHERE
子句过滤掉行之前他们被分组了。
【讨论】:
【参考方案4】:要获取重复名称的 id 以及名称:
SELECT p1.id, p1.firstname, p1,lastname FROM person p1
INNER JOIN person p2 ON (p1.firstname = p2.firstname
AND p1.lastname = p1.lastname
AND p1.id <> p2.id);
【讨论】:
@Alnitak,不要听我说什么,听我的意思:-)。【参考方案5】:如果你只是想删除所有重复的,你可以做一个临时表并用所有 youre data except the duplicate and them re-update you
re 主表填充它。
选择重复数据的查询是这样的
SELECT DISTINCT firstname, lastname FROM table
获取表中数据的完整列表
SELECT firstname, lastname, COUNT(*) AS n
FROM person
GROUP BY firstname, lastname
ORDER BY lastname DESC
HAVING n > 1
通过最后一个查询,您将获得按姓氏字母顺序排序的数据列表。
【讨论】:
【参考方案6】:要在表中查找重复记录(例如:查找重复记录的登录名和密码组合),请使用以下查询;
SELECT em.* FROM employee_master AS em JOIN
(SELECT emp.login, emp.password, COUNT(*)
FROM employee_master emp
WHERE emp.login != '' AND emp.password != ''
GROUP BY emp.login, emp.PASSWORD
HAVING COUNT(*) > 1
) AS dl
WHERE em.login = dl.login AND em.password = dl.password;
【讨论】:
以上是关于如何检查mysql表中多列的重复项的主要内容,如果未能解决你的问题,请参考以下文章
如何在插入 MySQL 之前检查表中是不是存在名称 [重复]