2

以前作成したこのトピック ( MySQL : 残りの日の合計が 30 未満の行をカウントする ) によると、今、私は別の問題を抱えています。合計である 30 日以内に有効期限が切れる行が必要です。そのため、1 か月に期限切れになる製品の数を知ることができます。これが私のコードです:

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

上の表から。複数のユーザーからの 4 つの製品が、今後 30 日以内に期限切れになります。

  1. ジョン= exp_product1、exp_product2
  2. アリス= 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

問題は、これらの行を 1 つの 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 に答える