select文の記述について

このQ&Aのポイント
  • select文の記述について質問させていただきます。データベースのテーブルから特定の条件でデータを抽出したい場合、select文を使用します。
  • データベースのテーブルから重複するデータを除外し、特定の列の値に基づいてデータを絞り込むには、select文の条件を設定します。
  • 上記のデータベースのテーブルの場合、number列を条件として2人分のデータを抽出するためには、select文にnumberの条件を追加します。
回答を見る
  • ベストアンサー

select文の記述について

select文の記述について質問させていただきます。 下記のデータベースのテーブルの先頭からnumberを条件として 2名分のデータをselect文にて抽出したいと思っております。 (numberが重複し、重複数も異なるデータとなります。) select文の記述をどのようにするか教えていただければと思っております。 よろしくお願いいたします。 データベースのテーブル +——+—————+—————+————+ | id | name | number | score | +——+—————+—————+————+ | 1 | tanaka | 358 | 98 | | 3 | tanaka | 358 | 23 | | 4 | tanaka | 358 | 45 | | 11 | yamada | 126 | 63 | | 17 | yamada | 126 | 77 | | 23 | suzuki | 274 | 36 | | 45 | suzuki | 274 | 16 | | 59 | suzuki | 274 | 89 | | 73 | suzuki | 274 | 75 | | 80 | hanako | 89 | 24 | | (以下続く) | +——+—————+—————+————+ 抽出結果 +——+—————+—————+————+ | id | name | number | score | +——+—————+—————+————+ | 1 | tanaka | 358 | 98 | | 3 | tanaka | 358 | 23 | | 4 | tanaka | 358 | 45 | | 11 | yamada | 126 | 63 | | 17 | yamada | 126 | 77 | +——+—————+—————+————+

  • MySQL
  • 回答数3
  • ありがとう数11

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

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

//元データ create table tbl(id int,name varchar(20),number int,score int); insert into tbl values(1,'tanaka',358,98),(3,'tanaka',358,23),(4,'tanaka',358,45),(11,'yamada',126,63),(17,'yamada',126,77),(23,'suzuki',274,36),(45,'suzuki',274,16),(59,'suzuki',274,89),(73,'suzuki',274,75),(80,'hanako',89,24); //検索 select * from tbl where number in( select number from (select number from tbl group by number order by min(id) asc limit 2) as sub ) order by id asc; 考え方 select number from tbl group by number order by min(id) asc limit 2 で、idの小さい2人分のnumberを抜き出し そのnumberを持つ全データを抜き出す。 本来であれば select * from tbl where number in( select number from tbl group by number order by min(id) asc limit 2 ) order by id asc; でいければ楽なのですが、通常のサブクエリにlimitが使えないので一度select文でうける

kondo3069
質問者

お礼

ご丁寧な回答ありがとうございます。 ご記述いただいた内容でうまく表示がされました。 まだまだSQLについての勉強が不十分でありますので、 記述いただいた内容をも1つずつ理解して 今後の活かしたいと思います。 ありがとうございました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

SQLは理論の構成が大事です。 それと、MySQLはVersion4と5以降ではかなり文法が 違います。大きくはサブクエリが使えるかどうかで、 書き方が全然違ってきます。DBの質問(DBに限らないが) では必ずバージョンを書くようにしてください。 理論としては以下の通りです。 1.名前でグループ化し、IDの最小値、NUMBERの最大値を  IDの最小値の昇順に並べる。 2.上記クエリから2レコード抜き出す。 3.抽出したレコードのNUMBERと一致するレコードを抽出する。 サブクエリが使えると簡単ですが、使えないバージョンですと かなり面倒なことになります。後者では一時テーブルくらい 使わないと不可能かも知れません。とにかく、バージョンを 補足してください。

回答No.1

where句を括弧を使って and , or で使い分けるだけです。 小学生くらいの算数で、出てくるグループ分けレベルです。

関連するQ&A

  • 複数テーブルをまとめてソート

    たとえば次のような、都道府県ごとのテーブルがあり、 ID、名前、得点の列があるとします。 テーブル1(テーブル名:tokyo) ID NAME SCORE 1 yamada 89 2 tanaka 45 テーブル2(テーブル名:osaka) ID NAME SCORE 1 sato 65 2 suzuki 22 これらのテーブルをまとめて、全国で得点が上位順に並べたいと 思っております。また、結果にはどのテーブルに所属するものかを 判別する列を追加したいのですが、どういう文を記述したらよいのでしょうか? 望みの結果は次のようなものです。 NAME SCORE TABLE_NAME yamada 89 tokyo sato 65 osaka tanaka 45 tokyo suzuki 22 osaka よろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL文がわかりません。

    いつもお世話になってます。 PHP+MySQLを使用しています。 下記のような操作を行いたいのですが、 MySQL文を教えて頂けませんでしょうか。 table名:person person_id : name : email 1 : tanaka : aaaaa 2 : suzuki : bbbbb 3 : sato : ccccc 4 : saito : ddddd 5 : takahasi : eeeee 上記のようなテーブルがあったとして、 例えば、person_idが2,4のものを抽出して、 table名:sendmail send_id : name : email : ticket 1 : ito : fffff : 10-20 2 : huruka : eeeee : 11-01 3 : suzuki : bbbbb : 11-19 4 : saito : ddddd : 11-19 上記テーブルに追加(send_idの3,4)したいのです。 ticketカラムは、send_idの3,4で同じ値(文字列)を使います。 大変お手数ですが、上記内容にてご教授願います。

    • ベストアンサー
    • MySQL
  • MySQL文を教えて下さい。

    テーブル名:table1 name | email | date ------+------------+------------- tanaka | aaaaaaaaaaa | 2010-11-01 sato | aaaaaaaaaaa | 2010-11-15 suzuki | bbbbbbbbbbb | 2010-11-10 上記のようなテーブルがあった時、同じemailの場合、 日付の新しいカラムで抽出して、下記の様な結果を得たいです。 name | email | date ------+------------+------------- sato | aaaaaaaaaaa | 2010-11-15 suzuki | bbbbbbbbbbb | 2010-11-10 この様な結果を得る為のMySQL文を教えて下さい。 初歩的な質問で申し訳ありません。お願い致します。

    • ベストアンサー
    • MySQL
  • SQL文の書き方について

    お世話になります。下記のような結果を求めるSQL文についてどなたかご教示をお願いします。 以下の2つのテーブル(SMPL_TBL1,SMPL_TBL2)があったとします。 (SMPL_TBL1) ID | NAME | BUSHO ---+--------+--------- 01 | YAMADA | A_GRP 02 | SUZUKI | A_GRP 03 | OKADA | B_GRP 04 | TAKAGI | C_GRP (SMPL_TBL2) ID | POINT | ---+-------+- 01 | 1 | 01 | 2 | 01 | 3 | 02 | 1 | 02 | 2 | 03 | 1 | 04 | 1 | 04 | 2 | 04 | 3 | 04 | 4 | 04 | 5 | 上記テーブルから以下のような結果を得たい場合、 どのようなSQL文を投げればいいでしょうか? (求める結果) ・各人ごとのPOINTのMAX値と各人のデータを抽出(POINTは1~999までの整数です) ID | NAME | POINT| BUSHO ---+--------+------+-------- 01 | YAMADA | 3 | A_GRP 02 | SUZUKI | 2 | A_GRP 03 | OKADA | 1 | B_GRP 04 | TAKAGI | 5 | C_GRP よろしくお願いいたします。

  • MySQLで複数のSELECT文を1文にまとめたい

    以下のようなテーブル table1 があります。 ******************* table1 ******************* Name, Kyouka, Score, ID ******************* 山田, 国語, 92, 10001 鈴木, 国語, 71, 10002 田中, 国語, 89, 10003 山田, 数学, 65, 10004 鈴木, 数学, 69, 10005 杉田, 英語, 96, 10006 山田, 英語, 63, 10007 田中, 英語, 76, 10008 ... ******************* カラムIDはPRIMARYを指定しています。 カラムScoreはインデックスを作成しています。 このテーブルで、「IDと教科」を指定したときに、以下の2つのデータを得たいと思っています。 (1) IDに対応する名前と、その教科中の順位 (2) その教科のレコード数 具体例としては、例えば「ID=10001、教科=国語」を指定したときに、「山田、3人中1位」というような情報が得たいです。 (「ID=10001、教科=英語」のようなおかしな組み合わせは指定しないようになっています。) (1) は、以下のようにして名前と順位を得る事が出来ました。 SELECT Name, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score and Kyouka='国語') AS rank FROM table1 a WHERE ID='10001' ORDER BY Score DESC; (2)は、以下のようにして特定の教科のレコード数を得る事が出来ました。 SELECT COUNT(*) FROM table1 WHERE Kyouka='国語'; しかし、実際にはレコード数が大量にあり、頻繁にこの検索を実行する予定なので、負荷が心配です。 出来るだけサーバーの負荷を減らすために、1回のSELECT文の実行で(1)と(2)をどちらも実現できるような方法はないでしょうか。 また、このテーブルでインデックスを作成しているのはIDとScoreのみですが、より負荷を減らすにはKyoukaにもインデックスを作成した方が良いでしょうか。 何卒、よろしくお願いいたします。

    • ベストアンサー
    • 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; -----------------------------

  • MySQL文(プリペアドクエリ)がわかりません。

    いつもお世話になってます。 PHP+MySQLを使用しています。 下記のような操作を行いたいのですが、 MySQL文を教えて頂けませんでしょうか。 table名:person person_id : name : email 1 : tanaka : aaaaa 2 : suzuki : bbbbb 3 : sato : ccccc 4 : saito : ddddd 5 : takahasi : eeeee 上記のようなテーブルがあったとして、 例えば、person_idが2,4のものを抽出して、 table名:sendmail send_id : name : email : ticket 1 : ito : fffff : 10-20 2 : huruka : eeeee : 11-01 3 : suzuki : bbbbb : 11-19 4 : saito : ddddd : 11-19 上記テーブルに追加(send_idの3,4)したいのです。 ticketカラムは、send_idの3,4で同じ値(文字列)を使います。 SQL文だと、 INSERT INTO sendmail (name,email,ticket) SELECT name,email,'11-19' FROM person WHERE person_id IN ( 2 , 4 ) で大丈夫なのはわかりました。 これをプリペアドクエリに変換する方法がわかりません。 $para01="11-19"; $para02="2,4"; $db = new mysqli("xxxxx","yyyyy","zzzzz","wwwww"); $presql = $db->prepare("INSERT INTO sendmail (name,email,ticket) SELECT name,email,? FROM person WHERE person_id IN ( ? )"); $presql->bind_param("ss",$para01,$para02); $presql->execute(); 上記で実行してみましたが、$para02は"2"と判断されて、 table名:sendmail send_id : name : email : ticket 1 : ito : fffff : 10-20 2 : huruka : eeeee : 11-01 3 : suzuki : bbbbb : 11-19 になります。(person_idが4のものが抽出されない。) 大変お手数ですが、上記内容にてご教授願います。

    • ベストアンサー
    • MySQL
  • Select文を教えて下さい

    select文についてお教えください。環境はAccess2003,Win XPで動かしています。 TABLE ID(INT),STOCK(INT) 001,100 001,200 001, 002,200 002,300 002,400 003,100 上記のようなテーブル、データがあります。 ■抽出したい行 001,100 001,200 ■抽出条件 STOCKに空がはいっている。 STOCKに空がはいっている行は選択しない。 STOCKに空がはいっているIDで、同一IDでSTOCKにデータがある行を抜き出したいです。 どのようにSQLを組み立てればよいかわかりません。 宜しくお願い致します。

  • SQLのSELECT文でのランダム抽出について

    SQLのSELECT文でのランダム抽出について データベースSQLiteでSELECT文の結果をランダムに抽出するには ORDER BY RANDOM()を使うようですが、前回ランダムに抽出された順序と同じ結果を得るにはどのようにすればよいでしょうか。 MySQLの場合は、ORDER BY RAND(n)でnの値を同じにすれば、同じ順序で抽出できるようですが、SQLiteでは無理なようです。 今考えているのはRANDOM()で得られた列の一つ(たとえばID)を一時的に別のテーブルを作成して保存後、その一時テーブルを利用するというものですが、もっと良い方法があるのではと思います。 何か別の方法がありましたら、教えていただきたくよろしくお願いいたします。

  • 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