
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件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
いまいち状況がつかめていないのですが、MySQLでNULLを
数値化するときはCOALESCE(NULL,0)とします
これは引数のうち、NULLを除いた最初の数値を返す関数です
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だけで取れるようにはなります。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpの問い合わせフォームを作っ...
-
reuterの記事をbeautiful.soup....
-
PHP8でWarning:Undefined varia...
-
composerをインストールしたい...
-
Q&Aサイトを作成していてURLの...
-
marginの値でマイナス値を設定...
-
submitで思うようにページが遷...
-
HTML PHP ラジオボタンのイベント
-
php でqiitaのサイトにあったフ...
-
SplFileObject を利用したとき...
-
PHPの勉強してます。 配列のと...
-
BASIC認証のフォームをデザイン...
-
アップロードファイルを表示す...
-
複数のパソコンの中の1つのパソ...
-
返信機能のツリー構造の深さを...
-
PHPについて。
-
phpのheader("Location:#pos")...
-
PHPからCSVをアップロード後、m...
-
[php初心者]サイトを見てデータ...
-
phpに関わる所での、form actio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
date関数を教えてください
-
質問:年月日の表示方法について
-
prologの引数
-
postgresのカレンダーについて
-
PHP+MySQLで月ごとの数量を表...
-
【PL/SQL】DATE型の時刻の表示...
-
countで0を返せますか?
-
EXCELマクロのSQL文での引用符...
-
Prologの現在時間の取得
-
UNIXの時間はどう変更すれ...
-
更新履歴を古い順に表示させる...
-
掲載日と更新日の管理の仕方
-
Smarty
-
dateのフィールドタイプについて
-
php mysql データ登録
-
現時刻とjson(オブジェクト形...
-
PHP5+MySQLで現在日時とDB内の...
-
PHPとMysqlを使用した集計表の...
-
DB登録に関する日付の認識
-
Strict Standards: date() ...
おすすめ情報