SQL查询:查找只有一个产品类型的用户

3

我郑重发誓,尽我所能去寻找现有的问题,只是可能不确定如何正确表达出来。

我想返回仅拥有一个产品类型配额的用户记录。

| user_id | product |
|       1 |     A   |
|       1 |     B   | 
|       1 |     C   | 
|       2 |     B   | 
|       3 |     B   | 
|       3 |     C   | 
|       3 |     D   | 

在上面的示例中,我想要一个查询,只返回仅为一种产品类型提供配额的用户 - 目前哪个产品并不重要。
我尝试使用select user_id, product from table group by 1,2 having count(user) < 2,但这不起作用,select user_id, product from table group by 1,2 having count(*) < 2也不起作用。
任何帮助将不胜感激。

你应该尝试使用 group by user_id having count(distinct product) = 1 - randomDude1001
“我郑重宣誓我已经尽力了…”。那么,你是否已经尽力创建自己的查询? - Eric
3个回答

1

你的having子句很好,问题在于你的group by。尝试这样做:

select user_id
, count(distinct product) NumberOfProducts 
from table 
group by user_id
having count(distinct product) = 1

或者你可以这样做,更接近于你原来的方式:

select user_id
from table 
group by user_id 
having count(*) < 2

谢谢!这似乎有效。有没有办法在结果中显示产品名称? - Shawn Werner

0

group by子句不能使用序数参数(例如,order by子句可以)。当按值(如1)分组时,实际上是按照字面值1进行分组,这对于表中的任何行都是相同的,因此将所有行分组到一个组中。由于整个表中有多个产品,因此不会返回任何行。

相反,您应该按user_id进行分组:

SELECT   user_id
FROM     mytable
GROUP BY user_id
HAVING   COUNT(*) = 1

1
谢谢!感谢您的帮助。 - Shawn Werner

0
如果你想要这个产品,那么请执行以下操作:
select user_id, max(product) as product
from table
group by user_id
having min(product) = max(product);

having子句也可以是:

having count(distinct product) = 1

太棒了。这两个都非常好用。非常感谢! - Shawn Werner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接