2012-07-27 18 views
19

esta pregunta es bastante simple que por alguna razón no puede conseguir el resultado adecuado para mostrar sólo los registros duplicadosseleccionar y mostrar solamente registros duplicados en MySQL

Table : Paypal_ipn_orders 
id        payer_email 
1        [email protected] 
2        [email protected] 
3        [email protected] 
4        [email protected] 
5        [email protected] 

SELECT id, COUNT(payer_email) `tot` 
FROM paypal_ipn_orders 
GROUP BY payer_email 
HAVING `tot` >1 

ejemplo de salida

id  tot 
1   2 
4   2 

salida esperada

id  payer_email 
1  [email protected] 
3  [email protected] 
4  [email protected] 
5  [email protected] 

¿Cómo puedo hacer esto?

Respuesta

39
SELECT id, payer_email 
FROM paypal_ipn_orders 
WHERE payer_email IN (
    SELECT payer_email 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(id) > 1 
) 

sqlfiddle

+0

que devuelve este 'tabla desconocida estado: TABLE_TYPE estado de la tabla desconocida: TABLE_TYPE' y 'Mostrar filas 0 - -1 (0 total, la consulta tomó 39.6457 seg)' – user1542036

+0

@ user1542036 Eso no tiene nada que ver con esta consulta. Es correcto (consulte el sqlfidddle). Haga una búsqueda en Google sobre su error. –

+0

lo único que encuentro es que parece ser un problema con la versión particular de phpmyadmin? Estoy ejecutando 3.4.1 por lo que la actualización a la versión más reciente debería arreglarlo? – user1542036

-2

Intentar esta consulta:

SELECT id, COUNT(payer_email) `tot` 
FROM paypal_ipn_orders 
GROUP BY id 
HAVING `tot` >1 

¿Ayuda?

0
SELECT id, payer_email FROM paypal_ipn_orders 
WHERE payer_email IN (
    SELECT payer_email FROM papypal_ipn_orders GROUP BY payer_email HAVING COUNT(*) > 1) 
+1

esto también devuelve el samething como los otros – user1542036

8

El IN era demasiado lento en mi situación (180 segundos)

por lo que utiliza un JOIN lugar (0,3 segundos)

SELECT id, payer_email 
FROM paypal_ipn_orders i 
INNER JOIN (
SELECT payer_email 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(id) > 1 
) j ON i.payer_email=j.payer_email 
+0

Uso i.id SELECT, i.payer_email DE paypal_ipn_orders i de lo contrario se mostrará el error ambigua –

2

Obtener una lista de todas las filas duplicadas de la tabla:

Select * from TABLE1 where PRIMARY_KEY_COLUMN NOT IN (SELECT PRIMARY_KEY_COLUMN 
FROM TABLE1 
GROUP BY DUP_COLUMN_NAME having (count(*) >= 1)) 
+1

Con mucho, el más rápido, pero hay que quitar el "=" de recuento (*)> = 1 porque tomará los identificadores que existen solo una vez también. – Incognito

1

Hola anterior respuesta no va a funcionar si quiero seleccionar uno o más valor de la columna que no es el mismo o puede ser el mismo para ambos datos de fila

Por Ej. Quiero seleccionar nombre de usuario, fecha de nacimiento también. Pero en la base de datos el nombre de usuario no está duplicado, pero la fecha de nacimiento será duplicada, esta solución no funcionará.

Para este uso esta solución Necesidad de tener auto combinación en una misma mesa/

SELECT 
    distinct(p1.id), p1.payer_email , p1.username, p1.birth_date 

FROM 
    paypal_ipn_orders AS p1 

INNER JOIN paypal_ipn_orders AS p2 

ON p1.payer_email=p2.payer_email 

WHERE 

p1.birth_date=p2.birth_date 

Por encima de consulta devolverá todos los registros que tienen misma email_ID y la misma fecha de nacimiento

0

Esto funciona más rápido para mí

SELECT 
    primary_key 
FROM 
    table_name 
WHERE 
    primary_key NOT IN (
     SELECT 
      primary_key 
     FROM 
      table_name 
     GROUP BY 
      column_name 
     HAVING 
      COUNT(*) = 1 
    ); 
0

Creo que esta manera es la más simple. El resultado muestra la identificación y el correo electrónico del pagador donde el correo electrónico del pagador está en más de un registro en esta tabla. Los resultados están ordenados por id.

SELECT id, payer_email 
    FROM paypal_ipn_orders 
    WHERE COUNT(payer_email)>1 
    SORT BY id; 
1

aquí es el ejemplo sencillo:

select <duplicate_column_name> from <table_name> group by <duplicate_column_name> having count(*)>=2 

Se trabajará definitivamente.:)

0

similares a this answer, aunque he usado una tabla temporal en su lugar:

CREATE TEMPORARY TABLE duplicates (
    SELECT payer_email 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(id) > 1 
); 
SELECT id, payer_email 
FROM paypal_ipn_orders AS p 
INNER JOIN duplicates AS d ON d.payer_email=p.payer_email; 
1

uso este código

SELECT * 
    FROM paypal_ipn_orders 
    GROUP BY payer_email 
    HAVING COUNT(payer_email) >1 
0

SELECT * FROM t1 table unen table t2 DONDE (t1.name = t2 .name) & & (t1.id! = t2.id)

+1

¿Puedes explicar tu solución al problema? También puede usar la función de sangría de código del editor para resaltar el SQL (cuatro espacios). –

Cuestiones relacionadas