【问题标题】:How to check for duplicates in mysql table over multiple columns如何检查mysql表中多列的重复项
【发布时间】: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) 唯一键

标签: mysql sql search duplicates


【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-09
        • 1970-01-01
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多