web-dev-qa-db-ja.com

複数の列でmysqlテーブルの重複をチェックする方法

私は野球選手(すべて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    |                |
+-----------+-------------+------+-----+---------+----------------+

しかし、2度追加されたプレイヤーもいると思います。特定の名と姓のコンボの出現回数を調べて確認するにはどうすればよいですか?

26
cfrederich

これは重複のリストを提供します:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname 
HAVING COUNT(*) > 1;

すべての行のカウントを表示するには、having句を削除します。

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname;
61
RC.
SELECT firstname, lastname, count(id) count
  FROM person
 WHERE firstname = ?
   AND lasttname = ?
 GROUP BY firstname, lastname
4
manji

コピー数の減少値でソートされたリストの場合:

SELECT firstname, lastname, COUNT(*) AS n
  FROM person
 GROUP BY firstname, lastname
 ORDER BY n DESC
 HAVING n > 1

HAVING句は重要な部分です。結果をフィルタリングする必要がありますafter the GROUP BY句。WHERE句は行を除外するため、beforeはグループ化されます。

2
Alnitak

重複した名前と名前の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); 
1
Johan

単にすべての重複を消去したい場合は、一時テーブルを作成して、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

この最後のクエリを使用すると、姓のアルファベット順に並べ替えられたデータのリストが表示されます。

1
PRacicot

テーブル内の重複するレコードを検索するには(例:重複するレコードのログイン名とパスワードの組み合わせを検索するには)、以下のクエリを使用します。

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;
1
Naresh Chennuri