2012-06-21 31 views
5

爲我有,我需要選擇具有不唯一的,如果有一個類似的名字的人之中,都有那一套只應選擇一個名字的所有人員表不同的姓氏。在MySQL中使用

例子:

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

我想獲得

FirstN LastN 
Bill  Clinton 

FirstN LastN 
Bill  Clinton 
Bill  Cosby 
Bill  Maher 

我試過,但它不返回我想要的。

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

[編輯Aleandre P. Lavasseur句話後,我的文章]

+0

嘗試串聯姓氏和名字。請參閱下面的答案。 –

回答

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 

如果MySQL不支持,那麼內部查詢:

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

我覺得MySQL不支持'WITH' – bfavaretto

+0

@bfavaretto沒問題,相應地更新了,謝謝 – Glenn

+0

你需要'COUNT(*)'和'COUNT(DISTINCT lastn)'的別名。你也可以把它們的選擇完全 –

3

你可以試試這個:

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

這裏是一個[工作示例](http://sqlfiddle.com/#!3/c0c6e/4) –

0

可以概率巧妙地做到這一點...

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

一定要檢查空值,因爲這會抵消串聯。

+0

像這樣的連接返回cero對我來說,不應該使用CONCAT(FirstN,LastN)來連接My Sql嗎? – Jcis

+0

對不起。我是一名MS SQL人員。我只是建議concat作爲OP問題的一個選項。 –

0

類似的回答2,但只得到第一個註冊在名稱重複(你說的第一個結果,你想拿)

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;