Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于日期的左连接变化_Php_Mysql - Fatal编程技术网

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子句。。。。请查看下面的答案以了解解释…我很抱歉我的提问,但是,这会是怎样的?我不确定我是否理解了答案,我得到了您提到的部分,因为我的和包含来自左联接表的字段,空结果将无法满足我的需要,它们必须是来自我的第一个表的字段,但是我如何才能使它与日期一起工作?查询已添加到操作的末尾,非常感谢,这正是我所缺少的:我为我的提问道歉,但是,那会是怎样的呢?我不确定我是否理解了答案,我得到了您提到的部分,因为我的和包含来自左联接表的字段,空结果将无法满足我的需要,它们必须是来自我的第一个表的字段,但是我如何才能使它与日期一起工作?查询已添加到操作的末尾,非常感谢,这正是我所缺少的: