2012-06-21 15 views
5

Tengo una tabla desde la que necesito seleccionar todas las personas que tienen un nombre que no es único y que ese conjunto debe seleccionarse solo si entre las personas con un nombre similar, todos tienen una diferente apellidoUso de HAVING en MySQL

Ejemplo:

FirstN LastN 
Bill  Clinton 
Bill  Cosby 
Bill  Maher 
Elvis  Presley 
Elvis  Presley 
Largo  Winch 

Quiero obtener

FirstN LastN 
Bill  Clinton 

o

FirstN LastN 
Bill  Clinton 
Bill  Cosby 
Bill  Maher 

He intentado esto, pero no devuelve lo que quiero.

SELECT * FROM Ids 
GROUP BY FirstN, LastN 
HAVING (COUNT(FirstN)>1 AND COUNT(LastN)=1)) 

[Editado mi puesto después Aleandre P. Lavasseur observación]

+0

Trate concatenando el nombre y apellido. Ver mi respuesta a continuación. –

Respuesta

7
WITH duplicates AS (
    SELECT firstn --, COUNT(*), COUNT(DISTINCT lastn) 
    FROM ids 
    GROUP BY firstn 
    HAVING COUNT(*) = COUNT(DISTINCT lastn) 
     AND COUNT(*) > 1 
) 
SELECT a.firstn, a.lastn 
    FROM ids a INNER JOIN duplicates b ON (a.firstn = b.firstn) 
    ORDER BY a.firstn, a.lastn 

Si MySQL no soporta CON, a continuación, consulta interna:

SELECT a.firstn, a.lastn 
    FROM ids a 
     ,(SELECT firstn --, COUNT(*), COUNT(DISTINCT lastn) 
      FROM ids 
      GROUP BY firstn 
      HAVING COUNT(*) = COUNT(DISTINCT lastn) 
      AND COUNT(*) > 1 
     ) b 
    WHERE a.firstn = b.firstn 
    ORDER BY a.firstn, a.lastn 
+0

Creo que MySQL no admite 'CON' – bfavaretto

+0

@bfavaretto bien, actualizado en consecuencia, gracias – Glenn

+0

Necesita alias para' COUNT (*) 'y' COUNT (DISTINCT lastn) '. También puede soltarlos por completo –

3

se puede probar esto:

SELECT A.FirstN, B.LastN 
FROM (
SELECT FirstN 
FROM Ids 
GROUP BY FirstN 
HAVING (COUNT(FirstN)>1) 
) AS A 
INNER JOIN Ids B ON (A.FirstN = B.FirstN) 
GROUP BY A.FirstN, B.LastN 
HAVING COUNT(B.LastN)=1 
+1

aquí hay una [muestra de trabajo] (http://sqlfiddle.com/#!3/c0c6e/4) –

0

Puede prob hábilmente haga esto ...

SELECT FirstN + LastN as FullName, COUNT(*) 
FROM Ids 
GROUP BY FirstN + LastN 
HAVING COUNT(*) > 1 

Asegúrese de verificar los nulos ya que anulará la concatenación.

+0

Concatenando así me devuelve cero, ¿no debería usar CONCAT (FirstN, LastN) para la concatenación en My Sql? – Jcis

+0

Lo siento. Soy un tipo MS SQL. Solo estaba sugiriendo que Concat sea una opción para el problema del OP. –

0

similares para responder a 2 pero conseguir simplemente primer registro donde se repite el nombre (el primer resultado que habías dicho que querían obtener)

select T.FirstN, T.LastN from (
     select FirstN, LastN from Ids 
    group by FirstN, LastN 
     having count(1) = 1) T 
group by FirstN 
having count(1) > 1;