2011-06-23 27 views
25

tengo una mesa de jugadores de béisbol (todo el 1000 o así), con los campos:Cómo comprobar si hay duplicados en la tabla MySQL a través de varias columnas

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 |    | 
+-----------+-------------+------+-----+---------+----------------+ 

Pero creo que hay algunos jugadores que han conseguido añadidas en dos veces. ¿Cómo puedo revisar y verificar cuántas apariciones de un nombre de pila particular, apellido combo?

+2

Haga lo que dijo @RC, luego agregue una clave única '(firstname, lastname)' – Mikhail

Respuesta

60

Esto proporciona la lista de los duplicados:

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

Si desea ver los recuentos para cada fila eliminar la cláusula having:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname; 
+3

Claramente la mejor respuesta posible. –

+0

Perfecto !!! Gracias – Mohanraj

4
SELECT firstname, lastname, count(id) count 
    FROM person 
WHERE firstname = ? 
    AND lasttname = ? 
GROUP BY firstname, lastname 
+0

que solo le informa si _si_ una persona en particular es un duplicado, no _que personas_ están duplicadas. – Alnitak

+0

Sí, eso es lo que se pidió. – manji

+0

ah, sí, entiendo a qué te refieres. Creo que quiso decir _particular_ como en _ "distinto" _, en lugar de _ "específico" _. Fui igualmente vago en mi comentario, donde realmente quise decir _ "específico" _! :) – Alnitak

2

Para una lista ordenada por la disminución de valor del número de copias:

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

La cláusula HAVING es la parte clave - es necesaria para filtrar los resultados después de la cláusula GROUP BY, ya que una cláusula WHERE filtra las filas antes que están agrupadas.

1

al obtener ID de de nombres duplicados, así como los nombres hacen:

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); 
+0

@Alnitak, no escuches lo que digo, escucha lo que quiero decir :-). – Johan

1

Si simplemente desea borrar todo el duplicado, se podría hacer una tabla temporal y llenarlo con todo lo que re data except the duplicate and them re-update you re tabla principal .

La consulta para seleccionar los datos con duplicado sería este

SELECT DISTINCT firstname, lastname FROM table 

Para obtener la lista completa de los datos en la tabla que eres

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

Con esta última consulta que obtendrá una la lista de datos ordenados por apellido alfabéticamente.

1

Para encontrar registros duplicados (por ejemplo, para encontrar la combinación de nombre de usuario y contraseña de registros duplicados) en una tabla, utilice la consulta siguiente;

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; 
Cuestiones relacionadas