0

我以为我已经解决了这个问题,但它正在躲避我。有一个 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"    

我可以对这个查询做些什么来使这个聚合函数起作用?

4

2 回答 2

1

似乎您可以使用以下查询,该查询使用子查询来获取按andu_id分组的每个不同的总计数,然后您可以将聚合函数应用于子查询结果:p_idq_idsum()

select p_id, sum(total) Total
from
(
  select p_id, q_id, count(distinct u_id) total
  from responses
  group by p_id, q_id
) d
group by p_id;

请参阅带有演示的 SQL Fiddle

于 2013-05-23T00:49:32.670 回答
1

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

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

这些是我所做的更改:

  1. 删除了distinctin select distinct。这(通常)与group by.
  2. 更改count()count(distinct). 您想计算这对的不同出现次数。
  3. 添加了分隔符。这样 (23, 4) 就不会与 (2, 34) 混淆。以防万一。
于 2013-05-23T01:05:45.330 回答