我有一系列与“民意调查”相关的表格,他们存储有关他们的信息,他们的答案,投票,风格等。
有一个页面,我在其中显示有关单个民意调查的所有信息的报告,包括该民意调查的答案,每个答案的投票数,甚至“不活跃”答案的投票数(目前没有在民意调查中显示)。要提取该信息,我使用以下查询:
SELECT answers.id, answers.answer_text, COUNT(polls_results.id) as total
FROM answers LEFT JOIN polls_results
ON answers.id = polls_results.answer_id
WHERE answers.poll_id = ? AND answers.activate = '0'
GROUP BY answers.id
哪里“?”在准备查询时更改ID。此查询返回我需要的所有信息,例如:
[民意调查的名称]
[投票问题]
有效回答
无效答案
现在,关于问题本身,报告可以选择根据一系列日期过滤答案,可以是开始日期,结束日期或两者,当发生这种情况时,查询更改只添加以下内容:< / p>
完成此更改后,如果有回答,有效或无效,零投票,则查询根本不会显示,与没有日期范围的查询不同。
我没有找到任何解释,我已经尝试了这个查询的几个变体,但我相信它工作正常,我只是不明白为什么它会随着日期的变化如此剧烈。
有没有人知道或为什么会这样做?
编辑:
根据要求,这是带有AND子句的最终查询
SELECT answers.id, answers.answer_text, COUNT(polls_results.id) as total
FROM answers LEFT JOIN polls_results
ON answers.id = polls_results.answer_id
WHERE answers.poll_id = ? AND answers.activate = '0'
AND polls_results.date >= ".$startDate." AND polls_results.date <= ".$endDate."
GROUP BY answers.id
答案 0 :(得分:3)
polls_results在左连接子句中,因此它具有将具有空值的记录....现在当我们将条件放在where中时,具有null的记录将始终失败,如在评估了join之后应用过滤器的位置因此没有左连接的含义,它将作为内连接。
尝试将此And子句放在Join条件中,而不是where子句....
SELECT answers.id, answers.answer_text, COUNT(polls_results.id) as total
FROM answers
LEFT JOIN polls_results ON answers.id = polls_results.answer_id
AND polls_results.date >= ".$startDate." AND polls_results.date <= ".$endDate."
WHERE answers.poll_id = ?
AND answers.activate = '0'
GROUP BY answers.id
答案 1 :(得分:1)
您也可以使用子查询而不是join:
SELECT answers.id, answers.answer_text, (select count(*) from polls_results where
polls_results.answer_id = answers.id and polls_results.date >= ".$startDate." AND polls_results.date <= ".$endDate."
) as total FROM answers where answers.poll_id = ? AND answers.activate = '0'