Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

カテゴリ:開発 > MySQL

ねむい!

select
    1 as `users_id`,
    date_format(`date`,'%Y-%m') as `month`,
    sum(case when `pay` > 0 then `pay` end) as `in`,
    sum(case when `pay` < 0 then `pay` end) as `out`,
    sum(`pay`) as `total`
from
    `payments` where `date` like
(
    select
        concat(date_format(`date`,'%Y-%m'),'%') as `month`
    from
        `payments`
    where
        `id` = 1
);

数百人規模の同時アップデートでどれほどの性能がでるんだか…。

Atom1.0GHz、Memory2GB。厳しいかー。

分割してアーカイブして、せいぜい2000万件くらいのレコードなら問題ないっしょ。

とりあえずベンチマークのテストデータ作ろ。


メモメモ(・∀・)モエッ

delimiter //
create procedure proc_payment_months(in _users_id int, in _month varchar(7))
begin
    declare done int default 1;
    declare _in int;
    declare _out int;
    declare _total int;
    declare cur cursor for
        ※集計方法をあとで修正
        select sum(case when `pay` > 0 then `pay` end) as `in`, sum(case when `pay` < 0 then `pay` end) as `out`, sum(`pay`) as `total` from `payments`
        where `users_id` = _users_id and `date` like concat(_month,'%');
    declare exit handler for not found set done = 0;

    open cur;
    while done do
        fetch cur into _in, _out, _total;
            if _in is null then set _in = 0; end if;
            if _out is null then set _out = 0; end if;
            insert into `payment_months` (`users_id`,`month`,`in`,`out`,`total`) values (_users_id, _month, _in, _out, _total) on duplicate key update `in` = _in, `out` = _out, `total` = _total;
    end while;
    close cur;
end

月間集計テーブルの追加と、プロシージャーとトリガーの設定おk!

これで家計簿の月間表示に対応できる。

続きは明日。


( ゚Д゚)ネムヒー



どうしてもnull処理でクエリ一発処理させたいがために乱立するLEFT JOIN達。

まぁ適切であろう…インデックスが、今日を支えてマス。

MySQLに感謝しよう。



CodeIgniterのActive Recodeでメソッドチェーンの使い方あれこれ。(PHP5限定)

それなりに便利だと思うんだ。

たとえば、基底にユーザデータを取得するメソッドを作る

public function getUser(){
    $dbh = $this->db->get('user');
    $result = array();
    foreach($dbh->result_array() as $row)
        $result[] = $row;
    return $result;
}

ユーザIDからユーザデータを取得したい場合、whereメソッドで条件をセットしたあとにこのメソッドを呼ぶ

public function getUserById($id){
    $this->db->where('id', $id);
    return $this->getUser();
}

あとからページ分割に迫られてlimitしたい場合なんかも

public function getUserLimit($offset = 0, $limit = 10){
    $this->db->limit($limit, $offset);
    return $this->getUser();
}


好き嫌い別れるだろうけど、俺は好き。

シンプルに書けるから。


ところで、クラスメソッドや関数の引数に指定できる型がobject or array限定なのは、intもstringも適当に扱うPHPならではの仕様ってことなんですよね?

ま、俺のコーディングなんてPHP以上の適当っぷりだがな ( ゚д゚)、ペッ!


帰宅してまだ一時間半くらいしか経っていないのだが、もう二時。

さて、表題の件をメモします。

未来時間まで、あとどのくらい?

select timediff(from_unixtime(unix_timestamp(`created`)+86400),now());

http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.html

ここにunix_timestamp()の特筆事項が書かれておりますが、JST時間帯であればマッピングは1つと考えて問題なさそうです。

夏時間による標準時がunixタイムとしてズレが生じるので注意ということ!(きっと)

標準時 - Wikipedia

select datediff(now(),`created`) as date_diff, timediff(now(),`created`) as time_diff from `tweets`

時間差の関数使ってなかったので、これからは使えるようにメモ。


エビちゃんキレイやあああああ。

vlcsnap-00015

vlcsnap-00016

users(メモ:あ、passwordが抜けてる

5_1268577132078

user_data

5_1268576958602

バカですみません。


例えば可変長なデータに対応しようと思ったとき、おそらくこんな正規化の手続きを踏むと思うんです。

というか、これくらいなら固定長で定義し、増えたら増えたでカラム追加?

データ量とか、処理内容によって適切な選択肢があるとは思うのですが…。

この場合、goldは頻繁に更新される可能性があるのと、正規化したらuser_dataじゃないのか…あー。


いずれにしても、これだとオーバーヘッド過ぎるとは思っているんですけど、ねぇ。


なんせバカなもので、どう選択していいかワカンナイ!


自分に向いてる仕事って何なんだ?

↑このページのトップヘ