2012-06-21 11 views
5

Mam tabelę, z której muszę wybrać wszystkie osoby, które mają unikatowe imię i że ten zestaw powinien być wybrany tylko jeśli wśród osób o podobnym imieniu, wszystkie mają inne nazwisko.Używanie HAVINGa w MySQL

Przykład:

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

Chcę uzyskać

FirstN LastN 
Bill  Clinton 

lub

FirstN LastN 
Bill  Clinton 
Bill  Cosby 
Bill  Maher 

próbowałem tego, ale nie zwraca to, co chcę.

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

[Edytowane mój post po Aleandre P. Lavasseur uwaga]

+0

Spróbuj łącząc imię i nazwisko. Zobacz moją odpowiedź poniżej. –

Odpowiedz

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 

Jeśli mysql nie obsługuje za pomocą, następnie wewnętrzna zapytania:

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

Myślę, że MySQL nie obsługuje "Z" – bfavaretto

+0

@bfavaretto w porządku, zaktualizowane odpowiednio, dzięki – Glenn

+0

Potrzebujesz aliasów dla 'COUNT (*)' i 'COUNT (DISTINCT lastn)'. Możesz również rzucić je wybrać całkowicie –

3

można spróbować to:

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

Oto [próbka robocza] (http://sqlfiddle.com/#!3/c0c6e/4) –

0

Możesz zapytać róbmy to ...

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

Pamiętaj, aby sprawdzić, czy są zerowe, ponieważ spowoduje to unieważnienie łączenia.

+0

Łączenie w ten sposób zwraca cero dla mnie, czy nie powinieneś używać CONCAT (FirstN, LastN) do łączenia na My Sql? – Jcis

+0

Przepraszamy. Jestem facetem MS SQL. Właśnie sugerowałem concat jako opcję do problemu PO. –

0

Podobny odpowiedzieć na 2 ale coraz prostu najpierw zarejestrować gdzie powtarza się nazwa (pierwszy wynik mówiłeś, że chciał, aby uzyskać)

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; 
Powiązane problemy