2013-10-07 43 views
2

說我有一個表,如下所示SQL:如何選擇僅購買特定產品的用戶?

CUSTOMER  PURCHASES 
James  Basketball 
James  Football 
Alex   Basketball 

我將如何選擇的客戶,只購買了籃球? 即只有亞歷克斯。感謝您的任何幫助或建議。

+2

'COUNT' +'集團BY' +'HAVING'(+是'DISTINCT'的情況下,如果一個客戶可以購買兩次相同的產品,這是一個你的有效案例) – zerkms

+0

我對你之前試過的這個產品很感興趣 –

回答

8

這是一種使用標準SQL的方式;

SELECT CUSTOMER FROM Table1 
GROUP BY CUSTOMER 
HAVING COUNT(*) = 1 
    AND MAX(PURCHASES)='Basketball' 

An SQLfiddle to test with

如果客戶可能購買了多個籃球,您可以用COUNT(DISTINCT Purchases)代替COUNT(*)

如果你去數據庫特定的,一個更可讀的選項可能是EXCEPTMINUS,這裏是一個SQL服務器版本;

SELECT CUSTOMER FROM Table1 WHERE PURCHASES='Basketball' 
EXCEPT 
SELECT CUSTOMER FROM Table1 WHERE PURCHASES<>'Basketball' 

......這將做與後者(可能購買多個籃球)相同的事情。

+1

我的第一個想法是第一個選擇。我沒想到第二個,我也很喜歡!我想知道兩種流行的SQL實現之間的性能影響。 –

+0

我用你提供的第一個選項,它解決了。只是想知道,爲什麼你使用MAX for MAX(PURCHASES)='籃球'?謝謝您的幫助!! – user2853262

+1

@ user2853262在標準SQL中,除非您將它分組或在集合函數中使用它(例如'MIN' /'MAX' /'AVG),否則您不能在'HAVING'中使用''Purchases'' '/ ...)。在這種情況下(每組只有一個結果),MAX和MIN會給出相同的結果。 –

0
select * 
from purchase 
group by customer 
having count(*) = 1 
    and purchases = 'BasketBall';` 

工作實例

http://www.sqlfiddle.com/#!2/fe6ee/1

+1

工程,但是因爲您直接比較'PURCHASES'而不使用'GROUP BY'或其上的聚合函數,所以是MySQL特有的。 –

+0

由於我正在比較'採購',我需要單獨放置'select *'而不是'customer'列。 – cppcoder

+0

@cppcoder:不管你需要什麼 - 它不是ansi sql compilant,而是使用mysql的sql擴展。 – zerkms

相關問題