1

根据下面显示的数据库模式,从 PollResponses 表中为特定 PollId 计算轮询结果的最佳和有效方法是什么

在此处输入图像描述

如果我们对该特定民意调查有四个选项,我想拥有以下类型的数据

optionText
count
optiontext
count
optiontext
count
optiontext
count

例子

Obama
2000
Romney
1800
Clinton
3000
Xyz
1200

总共提取了 8 行

我正在使用 SQL Server 2012 sp1 更新

使用以下查询

select options.OptionText as [optionText]
,count(responses._id) as [count]
from Polls polls
inner join PollOptions options on options.PollId = polls._id
inner join PollResponses responses on responses.PollId = polls._id
where polls._id = 104
group by options.OptionText, polls._id

用 pollresponse 表的这个数据 在此处输入图像描述

我得到这个结果

在此处输入图像描述

而我应该得到 No 0 Yes 1

所有三个表的当前数据

  1. 民意调查

在此处输入图像描述

  1. 轮询选项

在此处输入图像描述

  1. 投票响应

在此处输入图像描述

4

4 回答 4

2

虽然我没有你的数据可以使用,但这里有一个非常粗略(即未经测试)的关于你应该做什么的想法。您基本上是INNER JOIN您的表格,然后使用聚合函数COUNT来计算每个分组候选人的所有响应。

select options.OptionText as [optionText]
,count(responses._id) as [count]
from Polls polls
inner join PollOptions options on options.PollId = polls._id
inner join PollResponses responses on responses.PollId = polls._id
where polls._id = @pollid
group by options.OptionText, polls._id

关于效率,我可以看到您正在使用主键和外键约束;您可以进行的另一项性能改进是在您的表OptionText上索引您的列PollOptions

于 2013-01-02T15:44:08.293 回答
2

我相信这会返回你想要的结果:

select po.optiontext,
  count(pr.optionid) Total
from PollOptions po
left join polls p
  on p._id = po.pollid
left join pollresponse pr
  on p._id = pr.pollid
  and pr.optionid = po._id
-- where p._id = 104
group by po.optiontext;

请参阅带有演示的 SQL Fiddle

根据您提供的示例数据,结果将是:

| OPTIONTEXT | TOTAL |
----------------------
|     HOD IT |     1 |
|   HOD Mech |     1 |
|     Mr. CS |     2 |
|         no |     0 |
|        yes |     1 |

编辑,如果您想按选项 id 对数据进行排序,那么您必须将其包含在group by

select po.optiontext,
  count(pr.optionid) Total
from PollOptions po
left join polls p
  on p._id = po.pollid
left join pollresponse pr
  on p._id = pr.pollid
  and pr.optionid = po._id
--where p._id = 104
group by po.optiontext, po._id
order by po._id;

请参阅带有演示的 SQL Fiddle

结果:

| OPTIONTEXT | TOTAL |
----------------------
|     Mr. CS |     2 |
|     HOD IT |     1 |
|   HOD Mech |     1 |
|        yes |     1 |
|         no |     0 |
于 2013-01-02T16:25:52.413 回答
1
SELECT 
    po.OptionText AS [optionText],
    COUNT(pr._id) AS [count]
FROM PollResponses pr
JOIN Polls p ON (p._id = pr.PollID)
JOIN PollOptions po ON (po.PollID = p._id)
WHERE p._id = @pPollId
GROUP BY po.OptionText, pr._id
于 2013-01-02T15:43:14.827 回答
0

我相信您编写的查询缺少 join 。. . 您显示的 ER 图中也缺少这点。但是,结果表有一个 OptionID。据推测,给定的民意调查有多个选项。所以试试这个:

select options.OptionText as [optionText], polls._id, count(responses._id) as [count]
from Polls polls inner join
     PollOptions options
     on options.PollId = polls._id inner join
     PollResponses responses
     on responses.PollId = polls._id and responses.OptionId = options._Id
where polls._id = 104
group by options.OptionText, polls._id

如果未连接响应和选项,则无法直接获取每个选项的响应数。

于 2013-01-02T16:18:05.610 回答