2013-10-07 42 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

相关问题