【问题标题】:SQL Query find users with only one product typeSQL Query 查找只有一种产品类型的用户
【发布时间】:2018-09-12 19:01:33
【问题描述】:

我郑重发誓我已尽我所能找到一个现有的问题,我可能不知道如何正确表达它。

我想为只有一种产品类型配额的用户返回记录。

| 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
  • “我郑重发誓我已经尽力了……”。那么您是否已尽力创建自己的查询????

标签: sql count having


【解决方案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

【讨论】:

  • 谢谢!这似乎奏效了。有没有办法在结果中显示产品名称?
【解决方案2】:

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

相反,您应该按user_id 分组:

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

【讨论】:

  • 谢谢!感谢您的帮助。
【解决方案3】:

如果您想要该产品,请执行以下操作:

select user_id, max(product) as product
from table
group by user_id
having min(product) = max(product);

having 子句也可以是:

having count(distinct product) = 1

【讨论】:

  • 太棒了。这两个工作都很漂亮。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-07-11
  • 2020-12-28
  • 2020-07-30
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多