1

以下に示す db スキーマに従って、特定の PollId の PollResponses テーブルからポーリング結果をカウントするための最良かつ効率的な方法は何ですか?

ここに画像の説明を入力

その特定の投票に4つのオプションがある場合、次のタイプのデータが必要です

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 テーブルのこのデータで ここに画像の説明を入力

私はこの結果を得ています

ここに画像の説明を入力

いいえ 0 はい 1

3 つのテーブルすべての現在のデータ

  1. 投票

ここに画像の説明を入力

  1. 投票オプション

ここに画像の説明を入力

  1. PollResponse

ここに画像の説明を入力

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 に答える