• ベストアンサー

PHP上のSQLで、SELECT文をいくつも書くか、サブクエリやjoinを駆使して一つにまとめるか

PHP上でSQLの、複数のテーブルを呼び出すとき、 サブクエリやjoinを駆使して、一つのSELECT文でまとめて 複数のテーブルを呼び出す方法と SELECT文を何度も発行する方法とがありますが、 やはり一つにまとめたほうが理想的なんでしょうか?

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

  • ベストアンサー
  • kuroiwa96
  • ベストアンサー率100% (2/2)
回答No.2

//メンバーテーブルからデータを取得 $hoge = mysql_query("SELECT name,age,city_code FROM member_table"); $i=0; while($piyo = mysql_fetch_row($hoge)){ $name[$i] = $piyo[0]; //名前を取得 $age[$i] = $piyo[1]; //年齢を取得 $city_code = $piyo[2]; //都市コードを取得 //都市コードから都市名を取得 $hogehoge = mysql_query("SELECT city_name FROM city_table WHERE city_code=".$city_code); $piyopiyo = mysql_fetch_row($hogehoge); $city_name[$i] = $piyopiyo[0]; $i++; } -------------------------------------------------------------------------------- これは極端な例ですが、レコード情報を取得しているループの中で、さらにクエリを 送信して情報を取得しています。 このようなケースでは、joinなりサブクエリなりを使用したほうが、パフォーマンスは 向上するかと思います。 個々のクエリに関しては、EXPLAINしてクエリの実行速度を計りながらコーディングして いくのがいいかと思います。 参考になりましたら幸いですが、参考にならない場合は読み飛ばしてくださいませ。

yuzuru0024
質問者

お礼

回答ありがとうございます。 ”10件表示”等の複数回処理の際に もう一度別のクエリを発行してリレーションさせたりすると パフォーマンスに影響がでることがあるということですね。 逆に言えば、一度程度の処理であれば、 パフォーマンスに影響はそんなにないということですね。 参考になりました。

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

その他の回答 (1)

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

>やはり一つにまとめたほうが理想的なんでしょうか? こればっかりは・・・ 意味があればまとめますし、意味がなければ別々に処理します。 ただ言えるのはSQLというものは往々にしてまとめるためのツールですから そういう利用方法を念頭においておいたほうがよいですね。

yuzuru0024
質問者

お礼

回答ありがとうございます。 ケースバイケースということですね。 参考になりました。

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

関連するQ&A

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • Laravelクエリビルダでサブクエリ同士JOIN

    Laravel11を使用しております。クエリビルダで、テーブルとサブクエリをJOINするにはjoinSub()やleftJoinSub()を使えばいいのですが、サブクエリとサブクエリをJOINするにはどうすればいいか分かりません。いろいろなドキュメントを見ていますが、どれもDB::table()から始まるものばかりで、テーブルとのJOINを想定したものばかりです。 サブクエリとサブクエリをJOINする方法をご存じの方、教えて下さるようお願いします。それとも、できないのでしょうか?

    • ベストアンサー
    • PHP
  • Access 2000 サブクエリとJOIN

    Access2000でSQLを発行したのですが、 エラーが出てしまいます。 テーブル(仮にtest1、test2)があるとして test1 ------------------------- 主キー | 番号|項目    1|  1|りんご    2|  2|ぶどう    3|  3|みかん    4|  4|いちご test2 ----------------------------- 一つ目|二つ目| 1| 2| 4| 1| ・・・略 test2には2つのフィールドがあり、1,2,3,4を既定値として 入れるようにしています。 やりたいとこは、test2をグループ化し「一つ目」と「二つ目」 の規定値の個数(1、2、3、4)それぞれのカウントを求めたいのです。 一つのフィールドの場合は、 select * from test1 join test2 test1.番号=test2.一つ目 group by test1.番号 で求められたのですが、二つのフィールドをグループ化した際、 一つ目のフィールドと同じ個数が二つ目のフィールドにコピーされてしまうのです。 ですので、FROM句でサブクエリを結合しその中で、 group化したものを、いくつかのサブクエリと結合し てみたのですが、うまくいきませんでした。 select cnt1.一つ目,cnt2.二つ目 from (select * from test1 left join test2 on test1.番号=test2.一つ目group by test1.番号) as cnt1 left join (select * from test1 left join test2 on test1.番号=test2.二つ目group by test1.番号) as cnt2 on cnt1.番号=cnt2.番号 といった形で作ってみました。 エイリアスをつけてしまった時点でエラーが出ているので、 どうにもしようがありません。 申し訳ないのですが、ご教授のほどよろしくお願いいたします。

  • inner joinでサブクエリ

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID ・数量 データ 001,1 001,3 002,3 002,2 002,4 003,2 商品テーブル ・ID データ 001 002 003 004 やりたいこと: 在庫テーブルには重複しているIDがあります。 商品テーブルには重複しているIDはありません。 在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。 ・select distinct ID FROM 在庫テーブル ・select ID FROM 商品テーブル この2つのjoin方法がわかりません。 結果として、 001 002 003 を取得したいいです。宜しくお願いします。 ちなみに select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル) というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

  • SQL LEFT JOIN

    SQLでわからないことがあるので質問させていただきます。 例えばの話ですが在庫テーブルというテーブルがあってそこに商品マスタ をLEFT JOINする際に SELECT *  FROM 在庫テーブル LEFT JOIN 商品マスタ ON 品番 = 品番 として実行すると返ってくる結果は在庫テーブルの全レコードと 品番で結んだ商品マスタに存在するデータってことですか? 上記のSQLと SELECT * FROM 在庫テーブル で返ってくるレコード件数が違うという時はどういう可能性が考えられるでしょうか? ちなみに商品マスタの品番レコードはすべてユニークになっていて 色やサイズで品番が複数存在するものではありません。 何回やってもレコード件数が前者のほうが多くなってしまいます。 分かる方がいらしたらぜひ教えていただきたいです。

  • select文の書き方

    すみません、SQL初心者です。 joinで結合元の複数のカラムから結合先の同一のカラムの値を参照する方法がわかりません。 以下の場合、どうすればいいでしょうか。 テーブルseisekiとsimeiがあります。 seisekiにはテストIDとテスト毎の英語と国語のトップの生徒の生徒番号のカラムがあります。 simeiには生徒番号と生徒名カラムがあります。 2つのテーブルをjoinしてテストIDから英語と国語のトップの生徒の氏名を求める場合のselect文はどう書けば良いでしょうか?

    • ベストアンサー
    • MySQL
  • サブクエリ内で INNER JOIN は

    グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、 以下のサイトで知ることができましたが。 http://www.yokablo.com/20120905717.html tb_score +-------+-------+-------+ | c_name | game | c_score | +-------+-------+-------+ | 山田 | 高飛び | 90 | +-------+-------+-------+ | 山田 | 徒競走 | 85 | +-------+-------+-------+ | 山田 | 玉入れ | 90 | +-------+-------+-------+ | 鈴木 | 徒競走 | 85 | +-------+-------+-------+ | 鈴木 | 騎馬戦 | 50 | +-------+-------+-------+ | 室伏 | 綱引き | 100 | +-------+-------+-------+ | 室伏 | 玉入れ | 10 | +-------+-------+-------+ SQL文: SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE 私の場合、t_score の親テーブル名`t_company`と、 子テーブル`t_items`がありまして、 以下のようなことをやりたかったのですが、エラーとなります。 上記SQL をサブクエリにします。 select * from ( SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING ( c_name ) INNER JOIN t_company ON t_company.c_name = tb_score.c_name WHERE c_score = MAXSCORE ) as T1 , t_items where T1.id_score = t_items.id_score 結果エラーメッセージは、 #1060 - Duplicate column name 'c_name' でした。 エラー箇所が、 GROUP BY c_name か、 USING ( c_name ) か、 INNER JOIN t_company ON t_company.c_name = tb_score.c_name なのか、分かりません。 SQL の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQL文について

    SQL文について 現在一度に検索ができずに困っているため質問します。 データベースに男性テーブルと女性テーブルがあります。 男性テーブル ・番号 ・名前 女性テーブル ・番号 ・名前 このテーブルより自分の父、母、母の父を表示させたいのですが SELECT 男性テーブル.名前, 女性テーブル.名前, (※母の父を表示させたい) FROM 男性テーブル, 女性テーブル WHERE 男性テーブル.番号=父の番号 AND 女性テーブル.番号=母の番号 このあと条件に (AND 男性テーブル.番号=母の父の番号) をつけることはできないためSQL文の書き方で困っています。 抽出データは複数なので※の部分にサブクエリを書くことができません。 何かよいSQLの書き方はありますでしょうか?

  • SQLのSELECT文教えてください。

    VB5.0で、DBはSqlServer2000です。 SQL文のSELECT文で質問です。 ○A_TABLEの構成(概略) ・・・担当コード1・・・担当コード2 ○TANTO_TABLE 担当コード/担当名 (質問)TANTO_TABLEからA_TABLEの担当コード1と担当コード2の担当名を抽出したいのです。 次のSQLだと担当コード1のみしか抽出できません。 効率よく担当コード1と2の担当名を抽出するSQLを教えてください。お願いします。 SELECT 担当名 FROM A_TABLE,TANTO_TABLE WHERE A_TABLE.担当コード1 = TANTO_TABLE.担当コード

  • JOINを使った文で、date > now();

    質問、失礼いたします。 PHP+MySQLでページを作成しています。 JOINを使って、2つのテーブルを表示しています。 その際に、「明日以降」という条件で絞り込みをしたいのですが、 【 AND date > now(); 】 という指定が上手く反映されません。 SQL文 SELECT table1.*, table2.kaijou, table2.cd, table2.member FROM table1 JOIN table2 ON table1.id = table2.id WHERE word LIKE '%東京%' OR word LIKE '%大阪%' AND date > now(); wordの条件は反映されています。 phpMyAdminの方から、直接SQL文を実行しても同じ結果だったので、 MySQLの方の接続は問題ございませんでした。 ご存じの方、宜しければご教授お願い致します。

    • ベストアンサー
    • PHP