重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【解消】通知が届かない不具合について

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にて処理するべき事なのか方法が思いつきません。

A 回答 (3件)

いまいち状況がつかめていないのですが、MySQLでNULLを


数値化するときはCOALESCE(NULL,0)とします
これは引数のうち、NULLを除いた最初の数値を返す関数です
    • good
    • 0

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だけで取れるようにはなります。
    • good
    • 0

 う~ん、そうね。

これは僕自身は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に行う方法は分からんです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!