2013-10-01 89 views
1

這應該是很容易的,但我只是無法找出這一個。選擇哪裏有超過2個非重複的記錄sql

瞭解了客戶訂單信息。該表中有一個名爲customers_email_address和customers_id的字段以及一些其他非必要字段。我需要找到不同記錄,其中位於customers_email_address字段中的條目不同但對同一customers_id唯一。換句話說,我需要了解客戶自從帳戶開始以來在其帳戶中更改了他們的電子郵件地址,因此我可以用他們的新電子郵件地址更新我的電子郵件廣告程序。我在設計網站時沒有想到的東西!

也許一個例子是:查詢

customers_ID customers_email_address 
1    [email protected] 
2    [email protected] 
1    [email protected] 
2    [email protected] 
1    [email protected] 
2    [email protected] 
3    [email protected] 
3    [email protected] 
3    [email protected] 

結果應該是這樣的:

customers_id customers_email_address 
1    [email protected] 
1    [email protected] 
2    [email protected] 
2    [email protected] 

只有返回,其中customers_email_address字段有多個不重複的記錄,但相同的customer_id

也許更好的東西會是這樣的:

customers_id customers_email_address1  customers_email_address2 
1    [email protected]   [email protected] 
2    [email protected]  [email protected] 

我希望這是有道理的。如果你有更好的主意,請隨時加入。

無論如何,感謝您的幫助球員。

+4

請出示當前的查詢和表結構。最好通過sqlfiddle – Wolph

回答

2

UPDATE:你可以像下面這樣做

SELECT DISTINCT o.customers_id, o.customers_email_address 
    FROM orders o JOIN 
(
    SELECT customers_id 
    FROM orders 
    GROUP BY customers_id 
    HAVING COUNT(DISTINCT customers_email_address) > 1 
) q 
    ON o.customers_id = q.customers_id 
ORDER BY o.customers_id; 

輸出:

 
| CUSTOMERS_ID | CUSTOMERS_EMAIL_ADDRESS | 
|--------------|-------------------------| 
|   1 |  [email protected] | 
|   1 | [email protected] | 
|   2 |  [email protected] | 
|   2 |  [email protected] | 

這裏是SQLFiddle演示

+0

認爲你可能已經擊中了頭部毛病!你真棒。謝謝! –

+0

會做。等待幾個它看起來像。 –

0

這將返回了兩列customers_email_address1和customers_email_address2和快,因爲它可以使用覆蓋我ndex

SELECT 
orders1.customers_ID 
, orders1.customers_email_address "customers_email_address1" 
, orders2.customers_email_address "customers_email_address2" 
FROM 
orders orders1 

INNER JOIN 
orders orders2 

ON 
orders1.customers_ID = orders2.customers_ID 
AND 
    orders1.customers_email_address != orders2.customers_email_address 

GROUP BY 
orders1.customers_ID 

; 

看到http://sqlfiddle.com/#!2/b1c8e/43

或者,如果你(在應用程序代碼更新時可能容易)需要一個非標準化的列表,你可以利用這一點,這也應該是大表非常快,甚至因爲覆蓋索引使用

SELECT 
    customers_id 
    , GROUP_CONCAT(DISTINCT customers_email_address SEPARATOR '|') as emails 
    FROM orders 
    GROUP BY customers_id 
    HAVING COUNT(DISTINCT customers_email_address) > 1 

看到http://sqlfiddle.com/#!2/b1c8e/41