• 締切済み

countで0を返せますか?

PHP,Mysql5です。 IFNULL関数で実現できそうなことがわかり以下のようなソースで 試してみたのですが0ではなくnullが返ってきてしまいます・・・ $where_sql = join(' || ' , $where); //$where_sqlの中身 DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-01' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-02' || 中略・・・ DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-30' || DATE_FORMAT(create_date, '%Y-%m-%d') = '2009-03-31' $sql = "SELECT create_date, IFNULL(Count(order_id), 0) as cnt FROM products_order_detail WHERE {$where_sql} GROUP BY order_id"; 例えば以下のような構成だとします。 2009-03-05のデータが1件存在 2009-03-12のデータが2件存在 2009-03-24のデータが1件存在 現状の結果は以下の通りです。 Array ( [0] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) [1] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) [2] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 当然の結果なのですがこのように存在する分のデータのみが返って きます。希望としての結果の配列は以下のような感じで Array ( [0] => Array ( [create_date] => 2009-03-01 [cnt] => 0 ) 中略・・・ [4] => Array ( [create_date] => 2009-03-05 [cnt] => 1 ) 中略・・・ [11] => Array ( [create_date] => 2009-03-12 [cnt] => 2 ) 中略・・・ [23] => Array ( [create_date] => 2009-03-24 [cnt] => 2 ) 中略・・・ [30] => Array ( [create_date] => 2009-03-31 [cnt] => 0 ) のように比較する日付のデータがあればカウントしなければcntに nullではなく0を入れたいのですがどうすればいいでしょうか? もしくはPHPにて処理するべき事なのか方法が思いつきません。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

いまいち状況がつかめていないのですが、MySQLでNULLを 数値化するときはCOALESCE(NULL,0)とします これは引数のうち、NULLを除いた最初の数値を返す関数です

  • kirin_f
  • ベストアンサー率51% (44/85)
回答No.2

SELECT sum(if(DATE_FORMAT( create_date , '%Y-%m-%d' )='2009-03-01' ,1,0)) as '2009-03-01', sum(if(DATE_FORMAT( create_date , '%Y-%m-%d' )='2009-03-02' ,1,0)) as '2009-03-02', sum(if(DATE_FORMAT( create_date , '%Y-%m-%d' )='2009-03-03' ,1,0)) as '2009-03-03', sum(if(DATE_FORMAT( create_date , '%Y-%m-%d' )='2009-03-04' ,1,0)) as '2009-03-04' FROM products_order_detail WHERE DATE_FORMAT( `create` , '%Y-%m-%d' ) BETWEEN '2009-03-01' AND '2009-03-04' とすると Array ( [0] => Array ( [2009-03-01] => 0, [2009-03-02] => 2, [2009-03-03] => 3, [2009-03-04] => 0, ) ) となり、希望の配列とはちょっと違いますが、データが存在しない日付の0件もSQLだけで取れるようにはなります。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 う~ん、そうね。これは僕自身はPHP側が負う処理(つまり、DB側に押し付ける「べきでない」問題)だと思うな。 「SELECT create_date, IFNULL(Count(order_id), 0) as cnt」 は、たとえば「2009-03-01|NULL」というレコードが抽出された上で初めてそいつを「2009-03-01|0」にするもので、「2009-03-01|NULL」というレコードそのものが抽出されない(存在しない)のにNULLを0に置換するもへったくれもない。なので、まず ~~~~テーブルA~~~~ create_date -------- 2009-03-01 2009-03-02  ・・・ 2009-03-31 ~~~~~~~~ という、1列、31レコードを持つ一つのテーブルあるいは関数でもストアドでもなんでも良いけどそういう何かによって作られた擬似テーブルが必要だ。で、そいつに対してproducts_order_detailを外部結合でくっつけたらSQL一発でできるだろう。なので、上のテーブルAを一時的に作成したり、MySQL(MySQL自体は私はほとんど知らないです申し訳ない)の何らかの機能でテーブルAを擬似的に作成できたりすれば良いんやけど、残念ながらMySQLでそれをCOOLに行う方法は分からんです。

関連するQ&A