• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:MySQLで複数のSELECT文を1文にまとめたい)

MySQLで複数のSELECT文を1文にまとめる方法と負荷軽減のためのインデックス作成について

このQ&Aのポイント
  • MySQLで複数のSELECT文を1文にまとめる方法と負荷軽減のためのインデックス作成について解説します。
  • 具体的な例を交えながら、IDと教科を指定したときに、名前と順位、およびレコード数を得る方法を紹介します。
  • また、サーバーの負荷を減らすためにインデックスの作成についても考察します。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.3

教科中の順位とその教科のレコード数を1回で取得するなら、下記の様にSELECT句内のサブクエリを一つ追加すれば良いだけです。 ---------------------------------------- SELECT Name, Kyouka, Score, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score AND a.Kyouka = b.Kyouka) AS rank, (SELECT COUNT(*) FROM table1 c WHERE a.Kyouka = c.Kyouka) AS count FROM table1 a WHERE ID = '10001' ORDER BY Kyouka, Score DESC; ---------------------------------------- また、上記の様に教科をサブクエリ内の結合条件で絞り込んでやると、WHERE句の条件を変えるだけで色々な絞込みが可能です。 例) [国語の全データを取得] ------------- SELECT Name, Kyouka, Score, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score AND a.Kyouka = b.Kyouka) AS rank, (SELECT COUNT(*) FROM table1 c WHERE a.Kyouka = c.Kyouka) AS count FROM table1 a WHERE Kyouka = '国語' ORDER BY Kyouka, Score DESC; ---------------------------------------- 性能が気になるようでしたら、下記の様にカウントはFROM句内のサブクエリで取得した方がよいかも知れません。 ---------------------------------------- SELECT Name, Kyouka, Score, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score AND a.Kyouka = b.Kyouka) AS rank, c.count FROM table1 a INNER JOIN (SELECT Kyouka, COUNT(*) AS count FROM table1 GROUP BY Kyouka) c USING(Kyouka) ORDER BY Kyouka, Score DESC; ---------------------------------------- なお、他の方も指摘されている通り、Kyoukaカラムにもインデックスを張ったほうが良いと思います。

bana0629
質問者

お礼

とても分かりやすいご回答をいただけて大変感謝いたしております。 ありがとうございました。

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

その他の回答 (2)

  • Python864
  • ベストアンサー率13% (4/29)
回答No.2

負荷を減らすという事なら、この場合SQLを1回にするよりも、 (2)の教科のレコード数は、ID別に毎回取得する必要は無さそうに思いますので、 その負荷が無駄になるという理由から、 (2)教科のレコード数は複数のIDに対して一回だけ取得し、 プログラムの変数等に格納しておくほうが効率的だと思います。 いずれにしてもKyoukaにインデックスを作成したほうがよいです。

bana0629
質問者

お礼

大変参考になりました。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.1

具体的に大量のデータがどのくらいあるのかわからないのでなんともいえないですが。 教科にはインデックスはったほうが良いです。 2は教科でグループバイして、教科毎のカウントを取得。 その結果を1のテーブル1と結合すれば一度のセレクトで取得できるでしょう。

bana0629
質問者

お礼

参考にさせていただきます。 ご回答ありがとうございました。

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

関連するQ&A

  • mysql where句複数テーブル複数条件摘出

    こんにちわ。 mysqlを二日前から勉強し始めた超初心者者です。 まったくの初心者なので質問が的外れかもしれませんがよろしくお願い致します。 以下の三つのテーブルがあります。 t_seito ============================= id name comment created_at 11 赤井 あかい 0000-00-00 00:00:00 22 青葉 あおば 0000-00-00 00:00:00 33 白木 しらき 0000-00-00 00:00:00 ============================= m_kyouka ============== kyouka_id ky_name    1    国語    2    数学    3    理科    4    社会    5    英語 ============== t_score ===================== sc_id seito_id sckyouka_id score  1   11    1    50  2   22    1    80  3   33    1    23  4   11    2    94  5   22    2    43  6   33    2    67  7   11    3    13  8   22    3    76  9   33    3    59  10   11    4    78  11   22    4    40  12   33    4    35  13   11    5    64  14   22    5    87  15   33    5    30     ===================== この三つのテーブルをwhere句で結合させて 社会が50以上で英語が50点以下のデータを全て表示する。 という条件で摘出したいのですが・・・ select * from `m_kyouka`,`t_seito`,`t_score` where `kyouka_id`=`sckyouka_id` and `id`=`seito_id` and `kyouka_id`=4 and `score` >=50 and `kyouka_id`=5 and `score` <=50 と入力したところ ”返り値が空でした (行数 0)。 (Query took 0.0000 seconds.)” と表示されました。 いろいろとネットやら参考書などで調べてはいたのですが、 該当する条件がなかなか見つからず今回はじめて質問をさせていただきました。 何卒ご教授のほどよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQL SELECT結果をSET

    質問は二つあります。 (1)二つのコードをひとつにしたいのですが、どうもうまくいきません SELECT id, (price * 10) FROM table WHERE id = 1; SET @sum = @sum + (SELECT ( SELECT id, (price * 10) FROM table WHERE id = 1); (2)コードの簡略化 SELECT id, (price * 10) FROM table WHERE id = 1 OR id = 3 OR id = 8; の、WHERE id = 1 OR id = 3 OR id = 8; の部分です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • もうちょっと賢いSELECT文が書けないものでしょうか

    初めまして、最近SQLをかじり始めたぺーぺーです。 効率の悪いSELECT文しか書けずに困っています。 下記のテーブルsoftware_tableから、 ・name列「oracle」 ・version値が最大 のレコードに含まれるid(=3)を拾ってきたいのですが、自分の頭では副問い合わせを使う方法か、ソートを使う方法しか思いつきません。 問題は副問い合わせ・ソートを使うと計算コストが大きくなってしまうことで、できることなら副問い合わせ・ソートを使わずに解決したいのですが、何か方法はないものでしょうか? よろしくお願い致します。 ----------------------------- software_table id name version 1 oracle 1 2 oracle 2 3 oracle 3 4 postgres 1 5 postgres 2 6 postgres 3 7 postgres 4 ----------------------------- ■副問い合わせを使った方法 SELECT id FROM software_table WHERE name = 'oracle' AND version = (SELECT max(version) FROM software_table WHERE name = 'oracle'); ■ソートを使った例 SELECT id FROM software_table WHERE name = 'oracle' ORDER BY version DESC LIMIT 1 OFFSET 0; -----------------------------

  • select文について

    現在、"user"というテーブルに"id"と"date(datetime)"という項目があり、その"date"にあるデータの中から月を指定して抽出したくて以下ようなSQL文を書いたのですがうまくいきません。 SELECT `id` FROM `user` WHERE convert((SELECT extract(month from `date`) FROM `user`), INTEGER) = 9 mysql5.0です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • php5+mysqlのSELECT文でwhere句を指定すると正しく動

    php5+mysqlのSELECT文でwhere句を指定すると正しく動きません。 レコード数を取得します。 ここで、field10(category)=text型の値に基づきレコード数を取得したいのですが、 $sql="select * from A where B='C'"; とするとレコード出力(index.php)で0を出力。 where句を指定せずに $sql="select * from A"; とするとレコード出力(index.php)で97を出力。 文字コード関係のQ&Aサイトを見ましたが、phpファイルの冒頭部分に $con = mysql_connect($DBSERVER, $DBUSER, $DBPASS); mysql_query("SET NAMES 'sjis'"); $selectdb = mysql_select_db($DBNAME, $con); を指定しています。 テーブルAに含まれるデータは、csv(,区切り)で、load data infile・・・しました。 ※Records:97 Deleted:0 Skipped:0 Warnings:0 他に考えられる原因・対処方法はありますでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • MySQLのselect文の設定に関して

    MySQLのselect文で、IDを例えば10001~10010までを検索する場合はどうすればいいのか教えて頂けないでしょうか? select * from table_A where ???

    • ベストアンサー
    • MySQL
  • 複数テーブルからselect

    sql初心者です。 複数テーブルからselectする書き方が解らず質問です。 ユーザーtable user_code | name | address ------------------------------- 1 | 山田 | 北海道 2 | 高橋 | 東京 3 | 鈴木 | 仙台 4 | 岡田 | 北海道 来店table raiten_code | user_code | raiten_date ------------------------------- 1 | 1 | 2011/05/23 2 | 3 | 2011/08/05 3 | 4 | 2011/08/05 4 | 2 | 2011/08/05 5 | 1 | 2011/10/09 6 | 1 | 2011/08/05 とテーブルがあったとして、 北海道に住むお客様 + 2011/08/05の日付指定で来店記録を拾いだしたいと思っています。 (5日に来店の北海道の方) SELECT * FROM ユーザーtable WHERE address='北海道' union SELECT * FROM 来店table WHERE visit_date ='2011/08/05'; unionにマージとあったので、多分違いそうだなと思いつつ、試してみましたが、うまくいかずにいます。 mysqlのリファレンスマニュアルなども色々見ているのですが、答えにたどり着けません。 なにかヒントのようなものでもかまいませんので、お助けいただけると助かります。

    • ベストアンサー
    • MySQL
  • Select文1 マイナス Select文2

    テーブルA ユーザーID,地名,県名,評価 テーブルB ユーザーID,県名,制覇flag のような二つのテーブルがあると仮定してSelect文1、 "select 県名,count(地名) from テーブルA where ユーザーID=1 group by 県名 order by count(地名);" の結果が 県名,count(地名) 北海道,30 東京,22 京都,15 名古屋,10 鳥取,9 沖縄,8 であるとし、 Select文2、 "select 県名 from テーブルB where usrid=1 and 制覇flag='true'" の結果が、 県名 北海道 東京 とします。 このSelect文1の結果から、Select文2の結果を引いて 県名,count(地名) 京都,15 名古屋,10 鳥取,9 沖縄,8 の結果を得るにはどうすればよいでしょうか? Mysqlのバージョンは5.0.21です。

    • ベストアンサー
    • MySQL
  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

HL-L8250CDNトナー交換エラー
このQ&Aのポイント
  • トナー交換を行ったのですがエラーメッセージが表示されるため何度も装着しなおしましたが交換してくださいと表示される。
  • Windows10で接続されているHL-L8250CDNプリンターのトナー交換時にエラーメッセージが表示されます。
  • HL-L8250CDNプリンターでトナーを交換した際、エラーメッセージが表示され、交換を促されます。
回答を見る