どちらの処理が早くなりますか?またメモリの使用量はどちらが優れているのでしょうか?
また、方法Bのクエリ実行は2回だと思いますが、方法Aはクエリの実行は一回と考えてもいいのでしょうか?

PHPとMySQLの環境です。
また、評価のやり方も教えて頂ければ大変ありがたいです。

■方法A
$q = "SELECT key, a, b, c FROM d WHERE a < 1 AND b > 1 ORDER BY c";
$rs = mysql_query ($q);
$row_num = mysql_num_rows ($rs);
while ($data = mysql_fetch_array ($rs)) {
echo $data[key] . $data[a] . $data[b] . $data[c];
}

■方法B
$q_c = "SELECT COUNT(key) AS count FROM d WHERE a < 1 AND b > 1";
$rs = mysql_query ($q_c);
$data = mysql_fetch_array ($rs);
$row_num = $data[count];

$q = "SELECT key, a, b, c FROM d WHERE a < 1 AND b > 1 ORDER BY c";
$rs = mysql_query ($q);
while ($data = mysql_fetch_array ($rs)) {
echo $data[a] . $data[b] . $data[c];
}

是非宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

技術的な裏付けはわかりませんが、そんなには変わる要素はなさそうですね


カウント数をとるなら普通はCOUNT()なのでB案の方がなにかとよろしいかと思います

根拠として通常全件表示は冗長なのでおこなわないケースが多く
たいていページングで範囲を限定して表示するからです。
カウントは全件、表示箇所は限定(たとえばLIMITするとか)となると
件数確認と表示は別で処理した方が効率がよくなります

この回答への補足

方法Cも加え、処理の時間を計測をしましたが、私の場合だとcount()が一番早くなりました。

■方法C
SELECT SQL_CALC_FOUND_ROWS

補足日時:2011/04/27 15:29
    • good
    • 0
この回答へのお礼

ありがとうございます。
やはりcount()の方ですか。パフォーマンス計測も調べてやってみたいと思います。

お礼日時:2011/04/27 14:23

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJSON形式でのページング処理について

下記で配布されているサンプルに、ページング処理を追加したいのですが、
どう書けばよいでしょうか?
http://format.fideli.com/developer/r_id_fme_fmu_8794_domain_format_.html

PEARのPagerを使える環境にしてみたのですが、
具体的にどう書けばよいか分かりませんでした。

また、IngridというjQueryプラグラインを試してみたのですが、
同じjQueryのためか、うまく動作しませんでした…。

TinyTable JavaScript Table Sorterという、jQueryとは関係ない、
スクリプトも試してみたのですが、単独では動作するのですが、
このスクリプトに組み込もうとすると、
ページング機能に対して、ノーリアクションでした…。

Aベストアンサー

まずページング処理をクライアント側(javascript)で行うか、サーバー側で行うか実装方針を決めて使うライブラリーを探しましょう。いったんデータを全部受け取ってjavascriptでページング処理して表示させる仕組みの方が作るのは楽そうですが効率は悪いです。

 いずれにの方法にせよ、ページング処理用のライブラリーをそのまんま適用は出来ないでしょう。ご提示のサンプルの改造がかなり必要だと思います。別途、ページング処理用のライブラリーを組みこんで使うなら、そっちの方の改造も必要になったりして、手間が増えるだけのような気がする。(ご提示のサンプルダウンロードして中身を見たわけじゃないですけど..)

 ページング処理用のライブラリーに、PEARのPagerを使うのは正解だと思います。こいつはページング処理の基本機能の提供ですから、これを使ってサンプルサイトのプログラムを改造するしかないですね。たぶんhtml/javascript側もPHP側も両方とも多少改造して、作りこんであげる必要があると思います。
 具体的には、中身がわからないのでなんとも言えません。

 

まずページング処理をクライアント側(javascript)で行うか、サーバー側で行うか実装方針を決めて使うライブラリーを探しましょう。いったんデータを全部受け取ってjavascriptでページング処理して表示させる仕組みの方が作るのは楽そうですが効率は悪いです。

 いずれにの方法にせよ、ページング処理用のライブラリーをそのまんま適用は出来ないでしょう。ご提示のサンプルの改造がかなり必要だと思います。別途、ページング処理用のライブラリーを組みこんで使うなら、そっちの方の改造も必要になったりして...続きを読む

Qmysql_num_rowsを使わず、SQL文のCOUNT関数で件数を得たい

以下のサンプルを実行すればうまくいくのですが、

$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
$selectdb = mysql_select_db($DBNAME, $con);
$sql = "select * from mytable where number = 10";
$rst = mysql_query($sql, $con);
$countnum = mysql_num_rows($rst);
echo $countnum . "件のレコードがありました。<br>";

◆実行結果:
10件のレコードがありました。


「10件のレコードがありました。」という一行の実行結果を得たい目的なら、
三行目を「$sql = "select count(*) from mytable where number = 10";」
みたいにCOUNT関数を使っても結果が得られそうに思います。
というかむしろ、その方がコードが短くて済みそうな気がするのですけど。

その場合、4~6行目のPHPコードはどのように記述したらいいでしょうか。
echo $rst; としても、変な文字列を返してきました。

以下のサンプルを実行すればうまくいくのですが、

$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
$selectdb = mysql_select_db($DBNAME, $con);
$sql = "select * from mytable where number = 10";
$rst = mysql_query($sql, $con);
$countnum = mysql_num_rows($rst);
echo $countnum . "件のレコードがありました。<br>";

◆実行結果:
10件のレコードがありました。


「10件のレコードがありました。」という一行の実行結果を得たい目的なら、
三行目を「$sql = "select count(*) ...続きを読む

Aベストアンサー

$sql = "select count(*) as count from mytable where number = 10";
$rst = mysql_query($sql, $con);
$row = mysql_fetch_assoc($rst);
echo $row["count"] . "件のレコードがありました。<br>";

みたいな感じで?

QAJAXでページング

下記サンプルに、ページング処理を追加したいのですが、
どうすればよいでしょうか?
http://www.atmarkit.co.jp/fdotnet/jqueryref/08ajax1/ajax1_08.html

Aベストアンサー

IE8だと、「条件コンパイルは中止されます」とエラー表示になってしまいます。

=>@マークが条件コンパイルのマークアップと判断されてるみたいです。
その場しのぎで対処しました。

 var ResultSets = [];
 $.each(data,function(index,value){
  ResultSets.push(value);
 });
 var hits= parseInt(ResultSets[0].totalResultsAvailable);
 var currentItem = parseInt(ResultSets[0].firstResultPosition);

Qmysql_num_rowを繰り返したい

ラジオボタン選択肢アンケートのデータをMySQLのテーブルに入れて、
mysql_num_row()で各選択肢の件数を抽出したいのですが。

選択肢は1~5の数値(int型)でanテーブルに入っています。

for ($i = 1; $ <= 5; $++) {
$rst = mysql_query("SELECT * FROM an WHERE field=$i", $con);
$kotae.$i = mysql_num_row($rst);
}
このように書くと 1の選択肢の数しか返してきません。しかも、件数が間違って返ってくる。
 文法が間違っているからだと思うのですが。上記のようなことをやりたいのです。

 forを使わないでやると、
$rst = mysql_query("SELECT * FROM an WHERE field=1",$con);
$kotae1 = mysql_num_rows($rst);

$rst = mysql_query("SELECT * FROM an WHERE field=2",$con);
$kotae2 = mysql_num_rows($rst);

$rst = mysql_query("SELECT * FROM an WHERE field=3",$con);
$kotae3 = mysql_num_rows($rst);

$rst = mysql_query("SELECT * FROM an WHERE field=4",$con);
$kotae4 = mysql_num_rows($rst);

$rst = mysql_query("SELECT * FROM an WHERE field=5",$con);
$kotae5 = mysql_num_rows($rst);
です。
 forを使って楽にやりたい場合はどうすればよいでしょうか
宜しくお願いいたします。

ラジオボタン選択肢アンケートのデータをMySQLのテーブルに入れて、
mysql_num_row()で各選択肢の件数を抽出したいのですが。

選択肢は1~5の数値(int型)でanテーブルに入っています。

for ($i = 1; $ <= 5; $++) {
$rst = mysql_query("SELECT * FROM an WHERE field=$i", $con);
$kotae.$i = mysql_num_row($rst);
}
このように書くと 1の選択肢の数しか返してきません。しかも、件数が間違って返ってくる。
 文法が間違っているからだと思うのですが。上記のようなことをやりたいので...続きを読む

Aベストアンサー

みたかんじmysql_num_rows()ではなく
SQLでcount(*)を使う方が効率的ですね・・・。
SELECT * FROM an WHERE field=1 ではなく
SELECT field,count(*) AS count FROM an GROUP BY field

どうしても今のままでやりたいならあまりお勧めはしませんが
$kotae.$i = mysql_num_row($rst);
のところを
${"kotae".$i} = mysql_num_row($rst);
としてみてください。

そもそもforをつかうなら配列を使うべきですね。
$kotae[$i]=mysql_num_rows($rst);
とすれば簡単に得られます。

QAjaxでページングしたいのですが・・・

Ajaxでページングしたいのですが・・・

phpとmysqlでページングを行っています。詳しくは下記の通りです。

データの総数は全部で35件あります。

1ページ目(hoge.com/list/?id=1)で
1件目~18件目を表示します。

2ページ目(hoge.com/list/?id=2)で
19件目~35件目を表示します。

1ページ目には『次のページ』と書いた画像を表示させ2ページ目へリンクを張り
2ページ目には『前のページ』と書いた画像を表示させ1ページ目へリンクを張っています。

ページングの動作としては問題ないのですがこのページングをAjaxと連携させるには
どうすればいいのでしょうか?

できるだけurlにパラメータは付けずにhoge.com/list/としクリックしたリンクにより値を送りそれぞれのページングデータを表示させたく思っております。

検索してみたのですが前もってそれぞれ静的ページを作っておきそれを読み込ませるという方法はあったのですがあくまでも動的に行いたいです。

行い事のサンプルページの紹介でも構いませんので実現できる方法を教えてください。

Ajaxでページングしたいのですが・・・

phpとmysqlでページングを行っています。詳しくは下記の通りです。

データの総数は全部で35件あります。

1ページ目(hoge.com/list/?id=1)で
1件目~18件目を表示します。

2ページ目(hoge.com/list/?id=2)で
19件目~35件目を表示します。

1ページ目には『次のページ』と書いた画像を表示させ2ページ目へリンクを張り
2ページ目には『前のページ』と書いた画像を表示させ1ページ目へリンクを張っています。

ページングの動作としては問題ないのですがこのページングをA...続きを読む

Aベストアンサー

Autopagerize的な機能をWebサイトに適用したい、ということかな?

AutoPagerize for Greasemonkey
http://userscripts.org/scripts/show/8551
素のIE6でもBookmarkletからAutoPagerizeできるxAutoPagerize - 0xFF
http://d.hatena.ne.jp/os0x/20080327/1206613170
AutoPagerizeをWordPressで WP-AutoPagerizeプラグイン :: 5509(+1.1)
http://5509.me/log/wp-autopagerize

はてなもAutopagerizeに対応しているので、ソースを見ると三項になるかもしれません。

キーワード「AutoPagerize」を含む新着エントリー - はてなブックマーク
http://b.hatena.ne.jp/keyword/AutoPagerize

Qmysql_num_rowsなどのWarningの原因がわからない

以下のプログラム、何が誤っているのでしょうか。

違う箇所で使ったPHPの使いまわし(そちらは問題なく動いている)
なのですが、サーバー上で実行しても

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result ...
Warning: mysql_free_result(): (以下同上)

となり、どうしても原因が究明できません。。

以下、省略してますが、本質は変わりません。SQL文($sql)を
phpMyAdminで通すとなんら問題なく問い合わせ結果が得られます。

<?php
 $con = mysql_connect(localhost, username, pss);
 $selectdb = mysql_select_db(mydb, $con);
 $sql = "SELECT Kaisya FROM MYTABLE";
 $rst = mysql_query($sql, $con);
 $recmax = mysql_num_rows($rst);//■←この行がWarning■
 $body = "<table border='1'>";
 $body .= "<tr>";
 $body .= "<td style=\"text-align: center;\">会社名</td>";
 for ($recnum = 0; $recnum < $recmax; $recnum++) {
  $col = mysql_fetch_array($rst);
  $body .= "<tr>";
  $body .= "<td>" . $col['Kaisya'] . "</td>";
  $body .= "</tr>";
 }
 $body .= "</table>";
 mysql_free_result($rst);//■←この行がWarning■
 $con = mysql_close($con);
?>
<html><head></head><body>
<?= $body ?>
</body></html>

以下のプログラム、何が誤っているのでしょうか。

違う箇所で使ったPHPの使いまわし(そちらは問題なく動いている)
なのですが、サーバー上で実行しても

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result ...
Warning: mysql_free_result(): (以下同上)

となり、どうしても原因が究明できません。。

以下、省略してますが、本質は変わりません。SQL文($sql)を
phpMyAdminで通すとなんら問題なく問い合わせ結果が得られます。

<?php
 $con = mysql_connect(local...続きを読む

Aベストアンサー

$selectdb = mysql_select_db($DBNAME, $con);
の下に
if(!$selectdb) die("エラー". mysql_error());
と書いてデバッグしてみてはいかがでしょうか?
結局#1でも書いたとおり記述ミスなどで
DBが選ばれてないのだとおもいますが・・・

phpMyAdminはDB自体を選んだ上でSQLを実行する
のでPHP上でDBが選ばれてない場合とは単純比較
はできないと思います。

Q通信における「ページング」ってなんですか?

通信の勉強をしている(させられている)のですが、今、本で、「ページング」って言う言葉が出てきました。
でも、意味が分かりません。国語辞典にも広辞苑にも載ってませんでした。
プログラム関係でも「ページング」というのがあるみたいなのですが、ネットワークにおける「ページング」
ってどういうものなのでしょう?商品化されてるものなどあるのでしょうか?

詳しい方教えてください。m(._.)m

Aベストアンサー

ネットワークからポケベルを呼び出すのも「ページング」ですが、携帯電話を呼び出すことも「ページング」と言います。
誰かがあなたの携帯電話番号をダイヤルすると、ネットワークから呼び出しを受けて着信音が鳴るわけですが、これが「ページング」を受けたということです。

通信で「ページング」とは、ネットワークから携帯電話・ポケベルに呼び出しをかけること、と考えて間違いないと思います。
なぜ「ページング」というのかは、わかりませんので、他の方におまかせします。

Qmysql_fetch_rowが 1 を返すことがある

プログラムコードが多いのですべては載せられないのですが


$rid = mysql_query($query = "select base from boards where base='$base'");//base は text型
$rid || die("$query :" . mysql_error() . "\n");

echo "rid: $rid \n";

if (! mysql_fetch_row($rid)) {
// そんな行は無い場合の処理・・・
}

という箇所で、ときどき

rid: 1
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /path/
to/htdocs/collect.php on line xx

という警告が出ることがあります。
mysql_query()でselect文のクエリを発行した場合は成功時にリソースID、クエリ失敗時に FALSE を返すとマニュアルにはあります。
たしかに上記部分が正常に動作する場合は、
rid: Resource id #102
といったリソースIDが表示されます。

では単純に 1 を返す場合は何を意味しているのでしょうか?

プログラムコードが多いのですべては載せられないのですが


$rid = mysql_query($query = "select base from boards where base='$base'");//base は text型
$rid || die("$query :" . mysql_error() . "\n");

echo "rid: $rid \n";

if (! mysql_fetch_row($rid)) {
// そんな行は無い場合の処理・・・
}

という箇所で、ときどき

rid: 1
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /path/
to/htdocs/collect.php on line xx

という警告が...続きを読む

Aベストアンサー

返り値
SELECT, SHOW, DESCRIBE や EXPLAIN 文、その他結果セットを返す文では、 mysql_query() は成功した場合に resource を返します。エラー時には FALSE を返します。
それ以外の SQL 文 UPDATE, DELETE, DROP などでは、 mysql_query() は成功した場合に TRUE 、エラー時に FALSE を返します。

"set names utf8" などもTRUEが返ります。

QPHPでページング

PHPで、1ページに20件表示とか ページング機能をつけたいのですが一向に分かりません。ASPでは、pagesize関数で作れたのですが・・・。
サンプルソースとかありませんか?

Aベストアンサー

セッション管理を使ってやるのが一般的です。
この質問では、何のデータを表示するのか分かりませんが、例えば、データベースにとろくされているデータを表示するときは、SQL文とオフセットをセッションに記憶させておいて、次ページを表示します。

<?php
$offset=0;
$size=20;
session_start();
session_register("sql");
$sql="select * from table_name LIMIT $size OFFSET $offset";
 :
 :
$offset=$offset+$size;
 :
 :
の様な形です。(省略しすぎ?(^^;)

Qmysql,GROUP BY,mysql_fetch_arrayを使っ

mysql,GROUP BY,mysql_fetch_arrayを使って、あるフィールドに入ってる項目を複数出したい。


わかりづらいタイトルで申し訳ありません。
ある項目を、登録数の多い順に一覧表示をし、それに関するコメントを表示と思っています。
countで数を取り、GROUP BYでまとめ、order byで並び変えをしています。
しかし、おそらくGROUP BYでまとめているせいで、本来フィールドに複数入っているものが1つしか出てきません。現在の環境とやりたいことをまとめさせていただきます。


【関連するテーブル】
game
 構造
 titleid , title
1 , 鬼武者3
2 , FF10
3 , ヴィーナス&ブレイブス ~魔女と女神と滅びの予言~
 ・
 ・
 ・
(本当はもう少し複雑ですが、今回の質問にはあまり関係がないためは省略しております)



tag
 構造
 tagid , tag
 1 , OPが素晴らしい
 2 , EDが素晴らしい
 3 , 世界観がいい
 ・
 ・
 ・


tag_title
 構造
 tagid , titleid , tagcom , tagcom_date(日付)
 1 , 1 , すばらしい , 2010-09-05
1 , 1 , やってよかった , 2010-09-05
1 , 2 , よくできている , 2010-09-05
 ・
 ・
 ・

上記3つのテーブルをメインに使います。


【表示したいこと】
 
OPがいいゲーム
 
 鬼武者3  登録数 : 3件 
  タグコメント: すばらしい(2010-09-05) / やってよかった(2010-09-05)
 ・
 ・
 ・
実際のページです ttp://www.game-minzoku.jp/tag.php?tagid=1



【組んだソース】 (CSSやら他のを省略)

$sql = "select * ,count(game.title)as count from game
left join tag_title on game.titleid = tag_title.titleid
left join tag on tag_title.tagid = tag.tagid
where tag_title.tagid = '{$tagid}' GROUP BY title order by count desc ";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);

while($row = mysql_fetch_array($result)){

echo "登録数 : ";
echo $row["count"].件;

echo "<img src=\"",$row["img"],"\" alt=\"",$row["title"],"\" width=\"100\">";
echo $row["title"];
echo "タグコメント : ";

if ($row["tagcom"] != ""){
echo $row["tagcom"];
echo " (" . $row["tagcom_date"] . ") / ";
}
}


です。
前述もさせていただきましたが、おそらくGROUP BYでまとめると、1つしか出ないとかそんな感じだとは思うのですが、どうやって解消したら良いのかがわかりません。。。
(ttp://www.game-minzoku.jp/tag.php?tagid=1
が実際のページですが、タグコメントが複数登録されているものも、1つしか出てこなくなっている感じです)

拙いご説明で本当に恐縮ですが、もしお分かりになりましたらよろしくお願いします。

説明不足の点などあればおっしゃってください!

mysql,GROUP BY,mysql_fetch_arrayを使って、あるフィールドに入ってる項目を複数出したい。


わかりづらいタイトルで申し訳ありません。
ある項目を、登録数の多い順に一覧表示をし、それに関するコメントを表示と思っています。
countで数を取り、GROUP BYでまとめ、order byで並び変えをしています。
しかし、おそらくGROUP BYでまとめているせいで、本来フィールドに複数入っているものが1つしか出てきません。現在の環境とやりたいことをまとめさせていただきます。


【関連するテーブル】
game
 構造
 ...続きを読む

Aベストアンサー

今、PHPのソースが以下だとしたら、

if ($row["tagcom"] != ""){
echo $row["taggrp"];
}

原因はtagcomが空文字のためと思われます。
なので、次のようにしてみてください。
全てのコメントが表示されるようになると思います。

if ($row["taggrp"] != ""){
echo $row["taggrp"];
}

あと、SQLをPHPを介さずに、MySQLへ直接実行できる環境があるならば、
そうすることでSQLとしては正常に取得できているのかが分かると思います。
SQLの問題でなければ、PHPを疑ってみるとよいと思います。


人気Q&Aランキング

おすすめ情報