• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPで、queryは何回投げるべきでしょうか)

PHPでのクエリ投げる回数とDBの負荷について

このQ&Aのポイント
  • PHPでのクエリ投げる回数とDBの負荷について考えています。エクセルで作ったような縦横型のリレーショナル構造で、各列の一番大きな値を赤文字にしたいと思っています。
  • (1)1回のクエリで全体を取得し、連想配列などにいれて各列をソートして1番大きな値を探す方法と、(2)必要な回数分、適したクエリを投げて、結果を変数に格納し、IDなどで一致させる方法を考えています。
  • (1)の場合は、DBに負荷がかからないかもしれませんが、多彩なフィルタやソートを使わずに、DBを使う意味があるのか考えてしまいます。一方、(2)の場合、列数が多いと1ページを表示させるために多数のDBアクセスが必要となるため、運用上の問題も考えられます。一般的なアプローチなどがあれば教えていただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

複数列というのがちょっと面倒なところですが こんな感じでどうでしょう? //元データ CREATE TABLE tbl (id int not null primary key,d1 int,d2 int,d3 int,d4 int,d5 int,index(d1,d2,d3,d4,d5)); INSERT INTO tbl VALUES(1,1,2,3,4,2),(2,5,4,3,2,1),(3,4,2,1,5,3),(4,2,4,5,1,1),(5,3,2,1,1,2),(6,1,1,1,5,1),(7,2,3,1,5,1); //集計 SELECT id ,d1,COALESCE((d1=m1),0) as f1 ,d2,COALESCE((d2=m2),0) as f2 ,d3,COALESCE((d3=m3),0) as f3 ,d4,COALESCE((d4=m4),0) as f4 ,d5,COALESCE((d5=m5),0) as f5 FROM tbl LEFT JOIN (SELECT MAX(d1) as m1,MAX(d2) as m2,MAX(d3) as m3,MAX(d4) as m4,MAX(d5) as m5 FROM tbl) as sub ON d1=m1 or d2=m2 or d3=m3 or d4=m4 or d5=m5 ORDER BY id

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

自分でしたら、以下のテーブルがあったとき、 CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `value` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ); INSERT INTO `test` (`id`, `value`) VALUES (1,10), (2,20), (3,29), (4,3), (5,28), (6,18), (7,11); まず第一に試すのはこのクエリ select id , value , (value = (select max(value) from test)) as flg from test 次に試すのがこの2つのクエリの組み合わせ。 select id, max(value) from test; select id, value from test; で、早い方を採用。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • コンボボックスの先頭行に空白行を入れるには?

    ACCESS2000です。フォームに貼り付けたコンボボックスのプロパティの値集合ソースにクエリを書いて、クエリ実行結果のデータを取得して、コンボボックスの内容としているのですが、先頭行に空白行を挿入して、2行目以降にクエリ実行結果のデータを入れたいのです。どうすればよいのでしょうか?ちなみに列数は4列です。 それから、その空白行に「(指定なし)」のような表示が可能であれば合わせて教えてください。

  • Access:クエリの集計でグループ化した値を一回だけ表示したい。

    Accessクエリで左から2列分をグループ化した時、一番左の列の値が何回も表示されないようにしたいです。具体的には、一番左の列が上から順に朝・朝・朝・昼・昼・昼・夜・夜というふうにグループ化されます。これは左から2列目のフィールドが1・2・3というふうになっていて、朝1・朝2・朝3のレコードがそれぞれ一件ずつ表示されているからだと思いますが、いちばん左の列の朝の表示を先頭の一回だけにしたいです。お願いします。

  • ACCESSでクエリがうまく使えません。

    ACCESS2003初心者です。 製品区分というルックアップがあります。 ルックアップの列数は2、連結列は2になっています。 1列目 | 2列目 薬剤A | 1 薬剤B | 2 ・ ・ ・ 薬剤S | 19 まであります。 このデータの11までをクエリで抽出したいのですが、 クエリの製品区分の抽出条件に <="11" と入力して実行しても上手く処理してくれません。 1と10と11だけに該当して表示されます。 >="1" And <="11" としても同じ結果でした。 ※仮に、抽出条件に"8"と入力して実行すると 問題なく、8に該当するデータが表示されます。 他の数字も同じように抽出されます。 11以下に該当するデータだけを抽出したいのですが、 どこが悪いのでしょうか? そもそも、ルックアップの2列目を抽出するような方法は良くないのでしょうか?

  • Access のクエリの一時保存

    Access でテーブルから様々な処理をしてクエリを作成しているのですけれども、 クエリが終了するまで時間がかかってしまいます。 普段、そのクエリに対して、データの取得等をすることが多いので、 毎回、クエリが実行されるのは非効率です。 もともとテーブル自体、それほど更新するわけではないので、 クエリを行った結果をどこかに保存しておいて、テーブルが変更されたときのみ、 クエリが実行されるというようなことは、Access ではできないのでしょうか? また、ほかの DB では、そのような機能があるものなのでしょうか? あまりデータベースに対して詳しくないので、教えていただければと存じます。

  • 複数行のクエリを、まとめて実行するには?mysqli_multi_query()?

    PHPとMySQLの環境です。 複数行のクエリを、まとめて送って取得したいと考えています。 ですが、今試行錯誤しているのですが、うまく行かない状態で、クエリをきちんと実行できません。 処理の流れとしては、 [DBにアクセス]→[2つのクエリの実行]→[データ取得]→[DBをクローズ] でいいのではないかと思ってやっているのですが、 2つのクエリを実行するのはなにやら無理なような記述もウェブ上で拝見しました。 その場合、同じDBの同じテーブル内の異なるデータを取得したいだけなのに、 わざわざ、一度DBにコネクトして、切断、そしてまたコネクトして、切断ということを繰り返さないとダメなのでしょうか。。? そもそも同一PHPファイル内で二度も接続、切断はすべきではないですか? ちなみに、 一つ目のクエリでは、テーブル(table_a)のレコード数をカウントしてPHP側で取得するという流れの処理です。 $query = "SELECT count(*) FROM `table_a`"; もう一つのクエリは、テーブル(table_a)の最新のレコードの、idカラムのidを取得するだけのものです。 $query = "SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; この処理を一度のクエリで入れ込むことは可能でしょうか。 それぞれ単独では実行できます。 PHPでこのような関数 mysqli_multi_query() を見つけて色々調べているのですが、 いまだに使用方法がきちんとつかめない状況です。 これで複数のクエリを送ることは可能でしょうか。 アドバイス宜しくお願いします。

    • ベストアンサー
    • MySQL
  • JavaScriptからAccess2003へのクエリが上手くいかない

    Access2003での質問です。 JavaScriptからAccessのDBに接続しているのですが、 プログラム中からのクエリだと結果が得られない(BOFがTrueになっている模様) ですが、そのまま同じクエリをAccessを起動し、クエリを行うと正しい結果が返ってきます。 ちなみに、プログラムの中では他にいくつも同じようなクエリを飛ばしており、成功しています。 クエリを実行させる場所(他のクエリが成功している場所)を変えてもBOFとなります。 この症状の原因を教えていただきたいです、よろしくお願いします。 クエリ var sql = "select * from Table1 where Field1 like 'abc*'" var rcdSet = database.Execute(sql) →rcdSet(0)を参照しようとすると、BOFとなります。

  • Accessでのテーブル、クエリ名のネーミング等

    Access2007にて、業務の簡単な支援DBをつくっています。 質問なのですが、みなさんはテーブル名やクエリ名をつけるときに、何かしらのルールを設けていらっしゃいますでしょうか。 特にクエリにクエリを使用する場合とか、何がどのクエリやテーブルを参照しているのか、後から見て、DBが複雑になればなるほど分かりにくくなっていきます。 オススメのネーミングルールや一般的に使用されるルールがあれば教えてください。 サイト等のご紹介でも構いません。 どうかよろしくお願い致します。

  • アクセス初心者です。

    アクセスのフォームについてです。番号を選ぶとリスト表示がでてきて自動的にテキストに文字列が入るように作ったのですが、思うようにいきません。 コンボボックス 名前     cmb_コード 列数     2 値集合タイプ テーブル/クエリ 値集合ソース T_ 納品物コード 列幅     2;4 連結列    1 で、テキストフィールドに[cmb_コード].column(1) としました。 コンボボックスに2列分のデータが出てくるのですが、列数も2列分表示されるのですが、コンボボックスの2幅ぶんでしか見れません。上下左右ともスクロールが表示されています。左右スクロールを表示しなくても2列分のデータが見れるようにしたいのですが、どのようにすればいいのでしょうか?別項目はきちんとできているのですが、この部分だけできません。見比べたのですが、違いが分かりません。よろしくお願いします。

  • クエリで複数回抽出

    ACCESSでパラメータクエリであるテーブルから複数回抽出をする時、[]OR[]OR・・・とやってますが この場合だと抽出回数が決まっていないと[]をつくった分空打ちしないといけないので面倒です。 他にいい方法はありますか?教えてください。 質問がわかりづらくてすいません

  • メモ型同士でクエリでつなぐことはできない?

    アクセスのテーブルのデータ型は メモ型同士でクエリでつなぐことはできないのでしょうか? テーブル1 ID 内容(メモ型) テーブル2 ID 内容(メモ型) で、メモ型で同じ文字列が入ってるのが複数あるので それらをクエリでつなぎたいのですが メモ型またはOLEオブジェクト型のフィールドを結合する事ができません。 ってなってしまうのですが、 400文字くらいの値同士をつなげたい場合はどうすればいいでしょうか?