MySQL Tips
MySQL Tips
インクリメント処理
ロックを取得する読み取り FOR UPDATE
http://dev.mysql.com/doc/refman/4.1/ja/innodb-locking-reads.html
SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
インクリメント処理のみであればUPDATE文のみで可能
UPDATE table_name SET count=count+1 WHERE id=1234
カラム型の数字指定
カラムの型を int(10) と指定した場合の 10 は、「ZEROFILL」オプション指定時の桁数を明示的に指示していることを意味する。
SELECT FOUND_ROWS
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
SELECT FOUND_ROWS()は、直前の SELECT SQL_CALC_FOUND_ROWS 文を LIMIT 節なしで実行した場合に返されるレコード数をが返る。
ページャの総ページ数取得に使用できる。
FIND_IN_SET()
知っておくと便利なMySQL関数 "FIND_IN_SET"
http://c-brains.jp/blog/wsg/10/05/17-175025.php
非正規化テーブルで1カラムに複数の値がカンマ区切りで収納されている場合
カラム hoge_ids に 1 が格納されている行を検索したい
SELECT * FROM table WHERE FIND_IN_SET('1', hoge_ids) ;
※ カラムに hoge_ids には 1,2,3,5,9' のように カンマ区切りの数値が格納
カラム hoge_ids に 1 か 10 が格納されている行を検索したい
SELECT * FROM table WHERE FIND_IN_SET('1', hoge_ids) OR FIND_IN_SET('10', hoge_ids);
dfwLibだと以下のように使用します。
$test->setSql('SELECT * FROM ipmes WHERE FIND_IN_SET(:name, name)');
$test->set('name', '1');
var_dump($test->execFetchAll());