MySQL:如何计算datediff()小于30的多行

时间:2013-02-20 16:13:10

标签: mysql count sum datediff

根据我之前创建的这个主题(MySQL : Count row where sum of left day is less than 30)。现在我有另一个问题。我需要那些将在30天内过期的行作为总和。所以我可以说一个月内有多少产品将过期。这是我的代码:

USER_DB

id         name        exp_product1         exp_product2          exp_product1
1          John        2013-03-01           2013-02-28            2013-03-27
2          Alice       2013-02-25           2013-04-25            2013-10-10
3          Ken         2013-01-10           2013-01-20            2013-02-11
4          Elise       2013-04-11           2013-05-23            2013-11-11
5          Bruce       2013-03-14           2013-06-06            2013-09-10

从上表中。在接下来的30天内,来自多个用户的4种产品将会过期。

  1. John = exp_product1,exp_product2
  2. Alice = exp_product1和
  3. 布鲁斯 = exp_product1
  4. 所以我写道:

        SELECT count(*) AS exp_pax1 
    FROM   user_db 
    WHERE exp_product1<=timestampadd(day, 30, now())
           AND exp_product1 >= now();
    
    SELECT count(*) AS exp_pax2 
    FROM   user_db 
    WHERE exp_product2<=timestampadd(day, 30, now())
           AND exp_product2 >= now();
    
    SELECT count(*) AS exp_pax3 
    FROM   user_db 
    WHERE exp_product3<=timestampadd(day, 30, now())
           AND exp_product3 >= now();
    

    然后我用PHP对这些结果求和:(假设取值)

    $exp_pax1=exp_pax1
    $exp_pax2=exp_pax2
    $exp_pax3=exp_pax3
    
    $total_exp=$exp_pax1+$exp_pax2+$exp_pax3;//4
    

    嗯,问题是:如何将这些行缩短为单个mySQL命令?请建议。

    此致

1 个答案:

答案 0 :(得分:1)

您可以将sum(*)替换为sum(YOUR CONDITION)以获取匹配行的数量... 因此,您的查询可能会更改为

SELECT sum(exp_product1<=timestampadd(day, 30, now()) AND exp_product1 >= now()) AS exp_pax1 
 FROM   user_db 

现在您可以添加产品2和3并获得总数

SELECT sum(exp_product1<=timestampadd(day, 30, now()) AND exp_product1 >= now()) + 
    sum(exp_product2<=timestampadd(day, 30, now()) AND exp_product2 >= now()) +
    sum(exp_product3<=timestampadd(day, 30, now()) AND exp_product3 >= now())
    AS exp 
FROM   user_db