我有以下表结构:
Participants - id, email, organisation_type_id, job_role_id
Answers - id, participant_id, question_id, answer
Questions - id, question, question_category
还有另外两个表,组织类型和工作角色,它们只有一个id和一个名称,在上表中引用。
表格中包含有人填写调查问卷时的数据(每个问题的答案是肯定或无答案)。每个问题也属于两个类别之一(由question_category字段表示)。
当有人完成调查问卷时,它会在Participants
表格中创建一条记录,并且每个问题都会在answers
表格中创建一条记录。
我想计算每个问题的肯定答案和答案,但是要根据特定的组织类型(在participants
表中保存)。
因此,例如,如果我想知道有多少人投票赞成,有多少投票没有谁是组织类型x的一部分,我想要查询如下:
Count all answers to each question, where the participant has a organisation_type_id of x, group by answer
为了让它更加混乱,我还希望包含该行,即使该特定问题还没有答案。例如,我可能有问题id x的答案,但没有来自参与者的组织,参与者是organisation_type_id y。我希望将问题作为一行返回,但在“回答计数”中为0。列。
我的表格结构是这里的问题还是只是一个非常令人困惑的查询?到目前为止,我使用以下查询,然后使用PHP循环结果以检查它是否是我想要的组织或工作角色的一部分,但理想情况下我想要这样做全部在MySQL。
SELECT * FROM `questions`
JOIN `answers` ON `answers`.`question_id` = `questions`.`id`
JOIN `participants` ON `participants`.`id` = `answers`.`participant_id`
提前致谢!
答案 0 :(得分:0)
试试这个,
SELECT questions.id
,questions.question
,count(answers.id) as totalAns
,Sum(Case When participants.id is not null Then 1 Else 0 End) as WithPart
,Sum(Case When answers.answer = 'Yes' Then 1 Else 0 End) as YesAns
,Sum(Case When answers.answer = 'No' Then 1 Else 0 End) as NoAns
FROM questions
left JOIN answers ON answers.question_id = questions.id
left JOIN participants ON participants.id = answers.participant_id
and participants.organisation_type_id = 'x'
group by questions.id,questions.question
答案 1 :(得分:0)
如果您想要回答问题而没有回答,您必须从问题内部加入答案中选择。以下查询为您提供答案是或否答案的问题:
select p.id, a.answer
from Participants p
inner join Answers a ON p.id = a.participant_id
where a.answer = 'yes' or a.answer = null
答案 2 :(得分:0)
你想要所有的问题。所以从问题中选择。您想要某些参与者给出的问题的所有答案。所以外部按这些标准加入答案。要在一条记录中得到两个计数(对于是和否),请将它们加起来,而不是计算记录。
select
q.id,
sum( case when a.answer = 'yes' then 1 ) as yes,
sum( case when a.answer = 'no' then 1 ) as no
from questions q
left outer join answers a on a.question_id = q.question_id and a.participant_id in
(
select p.id
from participants p
where p.organisation_type_id = 'x'
)
group by q.id
order by q.id;