Php 基于日期的左连接变化
我有一系列与民意测验相关的表格,它们存储有关民意测验的信息、答案、投票、风格等 在一个页面中,我会显示一份关于一次投票的所有信息的报告,包括该次投票的答案,每个答案的投票数,甚至是非活动答案的投票数——目前投票中没有显示的答案。要提取该信息,我使用以下查询:Php 基于日期的左连接变化,php,mysql,Php,Mysql,我有一系列与民意测验相关的表格,它们存储有关民意测验的信息、答案、投票、风格等 在一个页面中,我会显示一份关于一次投票的所有信息的报告,包括该次投票的答案,每个答案的投票数,甚至是非活动答案的投票数——目前投票中没有显示的答案。要提取该信息,我使用以下查询: SELECT answers.id, answers.answer_text, COUNT(polls_results.id) as total FROM answers LEFT JOIN polls_results ON answers
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子句中,所以它是记录的主题,这些记录将具有null。。。。现在,当我们把条件放在where中时,带null的记录总是会失败,因为where过滤器是在计算连接后应用的,所以左连接并没有任何意义,它将作为内部连接工作
尝试将此And子句置于联接条件中,而不是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
polls_results在left join子句中,所以它是记录的主题,这些记录将具有null。。。。现在,当我们把条件放在where中时,带null的记录总是会失败,因为where过滤器是在计算连接后应用的,所以左连接并没有任何意义,它将作为内部连接工作
尝试将此And子句置于联接条件中,而不是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
您还可以使用子查询而不是联接:
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'
您还可以使用子查询而不是联接:
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'
此and应用于where子句或with join子句?其应用方式如下:where answers.poll_id=?和answers.activate='0'和polls_results.date>=.$startDate。尝试将此AND子句置于联接条件中,而不是where子句。。。。检查下面的答案以获取解释…此and应用于where子句或with join子句?其应用方式如下:where answers.poll_id=?和answers.activate='0'和polls_results.date>=.$startDate。尝试将此AND子句置于联接条件中,而不是where子句。。。。请查看下面的答案以了解解释…我很抱歉我的提问,但是,这会是怎样的?我不确定我是否理解了答案,我得到了您提到的部分,因为我的和包含来自左联接表的字段,空结果将无法满足我的需要,它们必须是来自我的第一个表的字段,但是我如何才能使它与日期一起工作?查询已添加到操作的末尾,非常感谢,这正是我所缺少的:我为我的提问道歉,但是,那会是怎样的呢?我不确定我是否理解了答案,我得到了您提到的部分,因为我的和包含来自左联接表的字段,空结果将无法满足我的需要,它们必须是来自我的第一个表的字段,但是我如何才能使它与日期一起工作?查询已添加到操作的末尾,非常感谢,这正是我所缺少的: