技術というのは日進月歩。1ヶ月前書いたコードを見なおして赤面するのも自分のスキルが伸びていると思いたい今日この頃です。今回の問題は、「Unable to save result set in」というエラーについてです。
目次
「Unable to save result set in」の意味は、「リクエストして、返って来るレコード数が多すぎて、MySQLからPHPに受け渡す為のファイルに全件保存出来なかったぜっ」という意味です。参照しているデータが多すぎるということですね。
多いなら数を制限してあげたらいい。SQLでlimitを使うことで取得するデータ数を制限できます。
/*データを先頭から100件取得する*/ SELECT * FROM tabledata LIMIT 100; /*データを先頭(0行目)から150件取得する*/ SELECT * FROM tabledata LIMIT 0, 150;
上記のセレクト文で取得するデータを制限することでエラーを回避できます。ただ、この方法だと全件取得して何かしらの処理をしたい場合には使えません。
私の場合は、全件を取得する必要がありました。limtを使えないので、よく調べてみると、この「Unable to save result set in」というエラーは、かなりのレコード数にならないと出てこない。それこそ、10万や20万程度では出てこないらしい。もちろん、正しく無駄なくデータを取得している場合の話です。
私が必要としたデータは、50万行くらいのDBから同じ名前のデータが何件あるかを取得すること。この取得方法が問題だったらしく結果的に、とんでもない数(800万行くらい)のデータを変数に代入していたようでしたw
サンプルでコードを載せておきます。同じ名前の人をカウントして変数に配列として格納するMySQL+PHPのコードです。
「テーブル名は、table_name」
user_id | column_name |
---|---|
1 | 田中 |
2 | 鈴木 |
3 | 山田 |
4 | 吉田 |
5 | 田中 |
6 | 山田 |
7 | 田中 |
8 | 鈴木 |
9 | 吉田 |
10 | 鈴木 |
$type_count = mysql_query(" select column_name, count(column_name) from table_name group by column_name "); while($type_count_echo = mysql_fetch_row($type_count)){ $type_count_echos[]=$type_count_echo; }
重要な要素は、必要なカラムのデータだけ取得していることです。全カラムのデータを取得してしまうとパンクしてしまいますし、動作も遅くなってしまいます。
これで、知りたいカラムの同値がどれだけあるかを配列に入れることが出来ます。2行で取得できるなんて・・・ものすごく不毛なコードを書いていた昔の自分が可哀想でなりません。