聚合多个字段

时间:2013-05-22 22:17:34

标签: mysql

我以为我想到了这个问题,但它让我不知所措。有一个MySQL数据库后端网络应用程序收集各种主题公园的用户调查。有一系列30个问题,一些有单选按钮式多选,有些是复选框式。响应都存储在类似于此的关系表中:

"id"|"q_id"| "a_id"|"u_id"                              |"p_id"| 
 "1"|   "1"|    "1"|"8f699ecbd9f130df14c1e4e0a6383516"|"106397"|
 "2"|   "1"|    "2"|"8f699ecbd9f130df14c1e4e0a6383516"|"106397"|
 "3"|   "2"|    "1"|"8f699ecbd9f130df14c1e4e0a6383516"|"106397"|
 "4"|   "3"|    "1"|"8f699ecbd9f130df14c1e4e0a6383516"|"106397"|
 "7"|   "3"|    "3"|"8f699ecbd9f130df14c1e4e0a6383516"|"106397"|
 "8"|   "3"|    "4"|"8f699ecbd9f130df14c1e4e0a6383516"|"106397"|
 "9"|   "1"|    "2"|"348895be7b4affac001c9ba096d8c1d3"|"106397"|
"10"|   "1"|    "3"|"348895be7b4affac001c9ba096d8c1d3"|"106397"|
"11"|   "3"|    "2"|"348895be7b4affac001c9ba096d8c1d3"|"106397"|
"13"|   "3"|    "3"|"348895be7b4affac001c9ba096d8c1d3"|"106397"| 
 "1"|   "1"|    "3"|"8f699ecbd9f130df14c1e4e0a6383516"|"380486"|
 "3"|   "2"|    "2"|"8f699ecbd9f130df14c1e4e0a6383516"|"380486"|
 "4"|   "3"|    "2"|"8f699ecbd9f130df14c1e4e0a6383516"|"380486"|
 "7"|   "3"|    "4"|"8f699ecbd9f130df14c1e4e0a6383516"|"380486"|
 "8"|   "3"|    "4"|"8f699ecbd9f130df14c1e4e0a6383516"|"380486"|
"11"|   "3"|    "2"|"348895be7b4affac001c9ba096d8c1d3"|"380486"|
"13"|   "3"|    "3"|"348895be7b4affac001c9ba096d8c1d3"|"380486"| 

q_id是回答的问题 a_id是选择的选项 u_id是选择该选项的用户 p_id是他们回答问题的游乐园

因此,这个表可能包含多个记录,其中u_id,q_id和p_id在复选框式问题的情况下是相同的,但是u_id,q_id,p_id和a_id都不相同。

我需要做的是创建一个查询,该查询将给出我对给定游乐园的每个给定问题的总回答次数。在这种情况下,我需要的是:

  "p_id"|"count" 
"106397"|"5"
"380486"|"4" 

...换句话说,我需要每个p_id,并计算q_id和u_id的唯一实例数。我认为这样可行:

SELECT distinct p_id, count(concat(q_id,u_id)) from responses group by p_id

但是,这似乎仍在计算两个记录,它们对q_id和u_id具有相同的值,但两次a_id的值不同,这给了我:

  "p_id"|"count" 
"106397"|"10"
"380486"| "7"    

我可以对此查询做些什么来使这个聚合函数有效?

2 个答案:

答案 0 :(得分:1)

您似乎可以使用以下查询使用子查询来获取按u_idp_id分组的每个不同q_id的总计数,然后您可以应用{{ 1}}聚合函数到子查询结果:

sum()

请参阅SQL Fiddle with Demo

答案 1 :(得分:1)

Bluefeet的回答绝对是一条路。这是您修改方法以使其工作的方式:

SELECT p_id, count(distinct concat(q_id,':',u_id))
from responses
group by p_id;

这些是我所做的更改:

  1. 删除了distinct中的select distinct。这通常是group by
  2. 的冗余
  3. count()更改为count(distinct)。你想要计算这一对的不同出现次数。
  4. 添加了分隔符。这样(23,4)不会与(2,34)混淆。以防万一。