小金井にあるWEB制作会社の備忘録

MEMORANDUM

MySQLの「NOT IN」を使用して特定の項目以外をランダムに取得する

毎月のランキングを集計していた際、項目数が最大数に満たない場合に残りの部分をランダムで取得・掲載していますが、その際に既に掲載対象となっているものと重複しないよう「NOT IN」を使用した際の方法をメモ。

PHP

$rankingsql = $db->query('SELECT id FROM tbl_post WHERE clicks != '' ORDER BY clicks DESC);
$num = $rankingsql->rowCount();

$notin = '';
$i = 0;

while($row = $rankingsql->fetch(PDO::FETCH_ASSOC)){
	if($i == 0){
		$notin = $row['id']
	}else{
		$notin .= ','.$row['id']
	}
	$i++;
}

$limit = 20 - $num;
$moresql = $db->query('SELECT id FROM tbl_post WHERE id NOT IN ('.$notin.') ORDER BY RAND() LIMIT '.$limit.'';

テーブル「tbl_post」からクリック数「clicks」が登録されているものを選出。
該当する投稿ID「id」を変数「$notin」に格納し、不足分(今回は20件から$numを差し引いたもの)を「$notin」を除いた中からランダムで再取得しています。

同一カテゴリーの記事