2012-01-24 57 views
3

我目前有一個客戶表,其中有重複的客戶。我想選擇一個獨特的客戶列表,沒有家庭電話或手機的重複。MySQL查詢的GROUP BY部分中的布爾邏輯

因此,如果任何客戶與其他客戶擁有相同的家庭電話或手機,那麼我不想從查詢中返回該客戶。

一個警告 - 如果家中的電話或手機是空的,那麼我顯然不想在反複製邏輯中進行計數,因爲有些客戶只有一部手機,或者只有一部手機。

這是當前我有的查詢,它會返回家庭電話和手機的唯一行。

SELECT id, firstname, lastname, homephone, cellphone, city, state, zip, 
country, FROM customers WHERE (homephone != "" OR cellphone != "") 
GROUP BY homephone, cellphone 

任何想法?謝謝。

+3

如果兩個客戶具有相同的家庭電話號碼,怎麼辦你決定放棄哪一個? – ruakh

+0

@ruakh如果他們有相同的家庭電話號碼 – MikeC8

+0

@danihp我的查詢不會返回預期結果 – MikeC8

回答

2

你要的所有電話號碼漏斗進入一個評估和排序/分組。

試試這個:

SELECT id, firstname, lastname, homephone, cellphone, city, state, zip, country 
FROM customers 
WHERE homephone != '' OR cellphone != '' 
GROUP BY case when homephone = '' then cellphone else homephone end 

將獲得發現的每一個獨特的價值的第一行「HOMEPHONE,但如果空白,則手機」

1

如果兩個客戶具有相同的非空的家庭電話或相同的非空的手機,那麼這個查詢將放棄一個具有較大id

SELECT id, firstname, ... 
    FROM customers c1 
WHERE (c1.homephone != '' OR c1.cellphone != '') 
    AND ( c1.homephone = '' 
     OR NOT EXISTS 
      (SELECT 1 
       FROM customers c2 
       WHERE c2.id < c1.id 
        AND c2.homephone = c1.homephone 
      ) 
     ) 
    AND ( c1.cellphone = '' 
     OR NOT EXISTS 
      (SELECT 1 
       FROM customers c3 
       WHERE c3.id < c1.id 
        AND c3.cellphone = c1.cellphone 
      ) 
     ) 
; 

注意,這可以給如果碰巧顧客X具有相同電話作爲客戶Ÿ,但同樣細胞電話作爲客戶Z.病理結果

+0

+1,但要小心,您應該用'c1.homephone'與'cellphone'一樣更改'customers.homephone';) – danihp

+0

@danihp:對不起,但我不確定你的意思。如果我提供的查詢存在問題,請隨時編輯我的答案以解決問題。 :-) – ruakh

+0

哦!你現在的答案是正確的!沒有編輯!?!?!怎麼會這樣? – danihp