PHPライブラリ dfwLib

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());