2

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

用户数据库

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

从上表。有几个用户的 4 件产品将在接下来的 30 天内过期。

  1. 约翰= exp_product1, exp_product2
  2. Alice = exp_product1 和
  3. 布鲁斯= exp_product1

所以我写道:

    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 命令?请建议。

问候,

4

1 回答 1

1

您可以将 count(*) 替换为 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 
于 2013-02-20T16:20:29.733 回答