質問: PHP+MySQLを使っているのですが、以下のような処理を行いたい時、どのような方法で実行するのがスマートですか? --- ■希望する動き <DB側> id name 1 バナナ 2 りんご 3 バナナ 4 みかん 5 りんご 6 ブドウ <PHP側> POSTで{"バナナ", "りんご", "みかん"}のような配列を受け取った時、 DB上のnameが合致するそれぞれの行数を知りたい。 (最終的に["バナナ"=>2, "りんご"=>2, "みかん"=>1]のような形にしたいです) --- ■自分で考えた方法 1.POSTされた配列の数だけSQLを実行する(COUNT句+WHEREで配列1要素を指定) 2.該当データを全部取り出してカウントはローカル側でやる(WHEREでORを使って取得→ローカル側でfor等で回してカウント) 3.該当データを全部取り出してサーバー上でカウントして返す 1だとSQLを実行する回数が多くなるので速度・負荷的に好ましくないと思いました。 2はサーバーからローカルに渡されるデータ量が大きくなる可能性があるので、少なくとも3でやるべきだとは思っています。 あまりデータベースやSQLについて詳しくないので、もしこれ以外のスマートな方法があるなら教えて頂きたく投稿しました。 「3でいいよ」などのご意見もありましたら頂けると助かります。
回答: ``` select name, count(id) from tablename where name in ('バナナ','りんご','みかん') group by name; ```