LABO IWASAKI

PDOで重複していない値の数を取得する

DISTINCT

PDOで色々やるに書かなかったので追加。
DISTINCTを使って重複していない値を計算します。
用途はそれぞれなので、色々使ってみてください。

こういう記事って探し方難しいですね。
PHPマニュアル読んでもよくわからんし。
お役に立てればなぁと思って書きました。

値の重複を取り除く

DISTINCT

DISTINCTとは…
直訳すると「独特な」という意味になります。

つまり、重複していないデータはいくつ存在するか、を数える事ができます。…まぁそのままの意味ですね。

例えば、何かしらの会員データがあるとして、あるページにアクセスした会員数を数える時にも使えます。同じ人のアクセスはカウントしない。
もっとイイ使い方はあるだろうけど、ここではこういうのを想定して書こうと思います。

例を挙げるのは難しいですが、「look」というデータベースのテーブルに「何人の会員が見に来たか」を数えるとしましょう。

「look」テーブルは、アクセスした時点でその会員のIDを取得してINSERTでデータを挿入しているとします。

例えば、IDが13の人が10回ページを訪問すると「look」テーブルにはID 13の人のデータが10回登録されます。

そんなシステム普通はないだろうけど、あくまでも想定です。

COUNTの場合

PDO COUNT

$stmt = $pdo -> prepare("SELECT * FROM look");
$stmt -> execute();
$count = $stmt -> rowCount();

look」に何個データが入ってるかを数える時は単純にこれでカウントできます。
でも「ID 13」の人のデータが5個あれば、それも全部カウントしちゃいます。
今回は、この重複データをカウントせずに、重複していないデータの数を数えるという趣旨です。

重複していない数

PDO MySQL DISTINCT

データベースのテーブル「look」から情報を取得します。
「look」には「id」「m」(月)「d」(日)というデータが入っている仮定です。
つまり「何月何日にどのIDの人がアクセスしたか」を記録しているテーブルという事です。
この時、id が重複していない数を数える方法です。

// 今日の日付
$nowm = date("m");
$nowd = date("d");
// 重複していないidの数を求める
$stmt = $pdo -> prepare("SELECT COUNT(DISTINCT id) AS id FROM look WHERE m=:m AND d=:d");
$stmt -> bindParam(':m', $nowm, PDO::PARAM_INT);
$stmt -> bindParam(':d', $nowd, PDO::PARAM_INT);
$stmt -> execute();
if ($rowstmt = $stmt -> fetch()){
  $distid = $rowstmt["id"];
}
$stmt = $pdo -> prepare("SELECT COUNT(DISTINCT id) AS id FROM look WHERE m=:m AND d=:d");

「COUNT」としておいてカッコ内でユニーク値を求めたい「id」を指定しています。
SUMでも同じような記述がありましたね。
これで「$distid」には重複していない数が入っています。

PDOの基本は「PDOで色々やる」に書いているので、そちらもご覧頂ければと思います。
もし、分かりにくい文章だったらすみません。