現在phpでwebサービスを開発している際にmysqlのDB関連で躓いたのでアウトプットさせていただきます。
データベース関連でSELECTしたデータ数を数えたいときにはcountで取得してくると思うがうまくいかないパターンが2種類ありました。
1.GROUP BY でデータをまとめたとき
2.GROUP BY でデータをまとめ、かつHAVINGで制限したとき
1の場合についてはcount関数を使うとGROUP BYでデータをまとめたものの数をとってきてしまうためcount(distinct カラム名)を使うことでうまくいきました。(これについてはリファレンスを参照してください)
問題は2の場合についてです。
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
GROUP BY を使ってHAVINGを用いた際はcount(distinct カラム名)ではうまく取得できませんでした。
そこで$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true)と$count = $stmt->rowCount();を使う
先に言うと私も詳しくはわかっていませんのでご了承ください!
イメージでは一度BUFFEREDにデータをためておいてrowCount関数で引っ張ってくるというイメージです
コードをご紹介します
関数名等は気にしないでください。
またhaving等は使っていない簡単な例を挙げています。
コードのように5行目のコードを書きexecuteした後にrowCountを使うことでデータ数を取得することができます。
もしcountでどうしてもデータ数が取得できないときは試してみてください!
一つ注意点としては、ページング処理等を行う関係でlimitを使ってデータ数をSELECTしてくるときは全データ数をとってくることはできません
その際は、1.データをとってくる関数と、2.データ数をとってくる関数を二つ呼び出す必要が出てくると思います
以上です。
少しでもお役に立てれば幸いです。
何か間違っている部分等御座いましたら、ご意見よろしくお願いします!