0

我进行了一项调查,其中所有答案都存储在“调查”表的单独行中。我的表如下所示:

(ID,user_id,Q,A)
(1,10,'laundry','oxiclean')
(2,10,'laundry','tide')
(3,10,'laundry','pods')
(4,11,'laundry','spray n wash')
(5,11,'laundry','resolve')
(6,12,'laundry','oxiclean')
(7,13,'laundry','oxiclean')

我现在需要提取仅选择特定产品的用户 ID 计数。

"SELECT *, count(user_id) FROM survey WHERE Q='laundry' GROUP BY a"

以上将给出一个总体计数,但我需要根据仅选择“oxiclean”的用户来获取我的计数。这应该返回 2。

或仅选择“oxiclean”和“潮”的用户。

如何执行从不同行提取的结果的这种“组合”?

非常感谢!

4

2 回答 2

1
select user_id from survey group by user_id having count(user_id) = 1

这将检索在调查中只有一个答案的用户列表。将其用作过滤条件:

select q,a,count(user_id) 
from survey
where a = 'oxiclean'
and user_id in (select user_id from survey group by user_id having count(user_id) = 1)
于 2012-10-06T20:13:45.167 回答
0

您可以使用子查询来实现这一点,对于您的情况,它将是这样的:

SELECT *, COUNT(user_id)
FROM survey AS s
WHERE Q = 'laundry'
AND A = 'oxiclean'
AND user_id NOT IN (SELECT user_id FROM survey WHERE Q = s.Q AND A != s.A);

s.Qs.A参考父字段,这样您就不必再次重新注入名称。
缺点:只有当您想要一个特定的答案时,该查询才有效。

如果您想要一个查询来检索总计数,这个应该可以解决问题:

SELECT A, COUNT(user_id)
FROM (
  SELECT A, user_id
  FROM survey
  WHERE Q='laundry'
  GROUP BY user_id
  HAVING COUNT(user_id) = 1
  ) AS t
GROUP BY A

缺点:查询只给出只有至少一个唯一 user_id 的答案,如此处所示并且这种语法会创建一个临时表,出于性能原因要避免这种情况。

于 2012-10-06T20:24:30.643 回答