LEFT JOIN基于日期的变化

时间:2011-03-11 22:59:04

标签: php mysql

我有一系列与“民意调查”相关的表格,他们存储有关他们的信息,他们的答案,投票,风格等。

有一个页面,我在其中显示有关单个民意调查的所有信息的报告,包括该民意调查的答案,每个答案的投票数,甚至“不活跃”答案的投票数(目前没有在民意调查中显示)。要提取该信息,我使用以下查询:

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。此查询返回我需要的所有信息,例如:

[民意调查的名称]

[投票问题]

有效回答

  • 回答1 [投票数]
  • 回答2 [票数]
  • 回答3 [票数]

无效答案

  • 回答4 [票数]
  • 回答5 [票数]

现在,关于问题本身,报告可以选择根据一系列日期过滤答案,可以是开始日期,结束日期或两者,当发生这种情况时,查询更改只添加以下内容:< / 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

2 个答案:

答案 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'