【问题标题】:PHP mysql query that does not count 0000-00-00不计入 0000-00-00 的 PHP mysql 查询
【发布时间】:2018-12-29 06:02:35
【问题描述】:

我需要计算 4 个日期,第一个日期需要等于 $_POST,其他 3 个不应将 0000-00-00 计为日期。

我试过这个查询:

$sql_list = "SELECT Agent,count(datum_obrade) as obrada, 
count(datum_kontakta) as kontakti,
count(datum_vracanja) as zadrzani,
count(datum_terminacije) as terminacija from wb_base WHERE datum_obrade = '".$_POST["From"]."' 
group by Agent";

问题是count() 会将0000-00-00 算作日期(我的专栏是 PHPMyAdmin 设置为 DATE) 我注意到,如果我在 DB 中手动将日期设置为 NULL,则查询不会计算它,但问题是我的 jquery 日期选择器不会在 NULL 为空时将其返回到 db 中。我也问过这个问题here

那么我如何设置这个查询来计算所有不是 0000-00-00 的日期。如果我在WHERE 之后添加AND,则查询需要匹配3 个条件。另外,如果我使用OR,它仍然会计算错误。

【问题讨论】:

  • 从数据库中取出完整的数据数组,并使用array_diff获取不是“0000-00-00”的数据并计算。

标签: php mysql mysqli phpmyadmin


【解决方案1】:

试试这个

sql_list = "SELECT Agent,count(datum_obrade) as obrada, 
count(case when datum_kontakta>0 then 1 end) as kontakti,
count(case when datum_vracanja>0 then 1 end) as zadrzani,
count(case when datum_terminacije>0 then 1 end) as terminacija from wb_base WHERE datum_obrade = '".$_POST["From"]."' 
group by Agent";

case 子句过滤掉所有不是>0 的条目。在这些情况下,null 值被发送到count() 函数,它不会 得分。所以最后只计算“有效”日期。

【讨论】:

  • 嗯,这确实有效,谢谢。我从不使用case,所以在这里做什么。它检查是否有任何计数 i 大于 0?什么是then 1 end 声明?
  • @rtstorm endcase 语法的一部分,它显示表达式的结尾在哪里。 then 1 是条件匹配时表达式返回的值。
  • @rtstorm 有关CASE 的语法,请参阅dev.mysql.com/doc/refman/8.0/en/…
  • @rtstorm 使用的case 语句隐含ELSE NULL;所以那些没有通过 WHEN 条件的“计数”为空。
【解决方案2】:
SELECT `Agent`
  , COUNT(NULLIF(datum_obrade, '0000-00-00')) as obrada
  , COUNT(NULLIF(datum_kontakta, '0000-00-00')) as kontakti
  , COUNT(NULLIF(datum_vracanja, '0000-00-00')) as zadrzani
  , COUNT(NULLIF(datum_terminacije, '0000-00-00')) as terminacija 
FROM wb_base 
WHERE datum_obrade = ?
GROUP BY `Agent`
;

这些 NULLIF() 函数会将匹配 '0000-00-00' 的值转换为 null,否则使用不匹配的值。

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 2015-07-19
    • 2013-06-09
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2012-12-22
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多