2011-09-29 86 views
0

我有工作了如何從下面的MySQL表返回所需的行存在一些問題:過濾重複

first_name  last_name  collection 
========================================== 
    Bob   Jones   1 
    Ted   Jones   1 
    Bob   Jones   1 
    Bob   Jones   2 
    Ted   Baker   2 

我想返回名字的基於列的計數'first_name'和'last_name'。通常情況下,這只是一個簡單的例子,使用'group by first_name,last_name',因此我們得到以下結果:Bob Jones的計數爲3,Ted Jones的計數爲1,Ted Baker的計數爲1。

但是,難度是第三列'收集'。我需要排除集合之間的重複名稱,但不在集合中。因此,如果第一個集合中不包含名稱,那麼我們會將第一個集合中的所有名稱都包含在計數中,但只包含來自第二個集合的計數中的名稱。

因此,理想的結果如下:Bob Jones的計數爲2,Ted Jones的計數爲1,Ted Baker爲1。

first_name  last_name  collection    included? 
==========================================   =============== 
    Bob   Jones   1     Yes 
    Ted   Jones   1     Yes 
    Bob   Jones   1     Yes 
    Bob   Jones   2     No 
    Ted   Baker   2     Yes 

我真的試圖讓我的頭在這附近,但我開始用盡想法。任何幫助將非常感激......謝謝!

回答

0

也許

SELECT first_name, last_name, COUNT(DISTINCT collection) AS cnt 
FROM yourtable 
GROUP BY first_name, last_name 

的COUNT DISTINCT會消除重複鮑勃/瓊斯/ 1條記錄。

+0

馬克您好,感謝您的回答,非常快!不幸的是,這不是我正在尋找的。我認爲,如果我們在第1集中發生了三次bob jones,第2集中發生了三次bob jones,那麼您建議的查詢只會返回一個2(兩個集合中的每一個都是一個),而實際上它應該是3因爲集合1中有三次出現bob jones。實際上,如果它在已經計數的另一個集合中突然出現,我們只是想忽略該名稱,但如果它沒有被包括在內,則將其包括在內。 – DrNoFruit

+0

我想你可以通過第一次,最後一次收集分組來做一個常規的「分組」來獲得每次收集計數,然後在另一個查詢中將其包裹起來以過濾出不需要的集合。 –

0

這是你所期待的嗎?

SELECT u1.first_name, u1.last_name, u1.collection FROM users u1 
WHERE u1.collection = (SELECT min(u2.collection) 
    FROM users u2 WHERE u1.first_name = u2.first_name 
    AND u1.last_name = u2.last_name); 

http://www.sqlfiddle.com/#!2/bd086/7