我有一系列与“民意调查”相关的表格,它们存储有关他们的信息,他们的答案、投票、风格等。
有一个页面,我在其中显示了关于单个民意调查的所有信息的报告,包括该民意调查的答案、每个答案的票数,甚至是“非事件”答案的票数(那些目前未显示在民意调查中)。为了提取该信息,我使用以下查询:
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 [得票数]
现在,关于问题本身,报告有一个选项可以根据日期范围过滤答案,可以是开始日期、结束日期或两者兼而有之,发生这种情况时,查询会更改,仅添加以下内容:
进行此更改后,如果有一个答案(无论是有效的还是无效的)零票,查询将不会显示它,这与没有日期范围的查询不同。
我找不到对此的解释,我尝试了这个查询的几个变体,但我相信它工作正常,我只是不明白为什么它会随着日期发生如此巨大的变化。
有没有人知道或知道为什么会发生这种情况?
编辑:
根据要求,这是带有 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
最佳答案
polls_results 在 left join 子句中,因此它的主题是包含包含空值的记录....现在当我们将条件放在 where 中时,带有 null 的记录将始终失败,因为在评估连接后应用 where 过滤器, 因此左连接没有意义,它将作为内连接工作。
尝试将此 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
关于php - 基于日期的 LEFT JOIN 变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5279278/