如何检查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 youre 主表填充它。

选择重复数据的查询是这样的

 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 表中的重复项

如何检查Mysql表中是不是存在记录[重复]

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

如何从mysql数据库表中仅获取php数组的匹配项[重复]

使用 R 如何删除基于多列的重复项,但选择重复项的“最完整”版本

如何对具有多列的表中的数据进行分组[重复]