2つの関連するテーブルで指定した値を条件に取得する方法

このQ&Aのポイント
  • mysql5.1.33を使用しています。2つの関連するテーブルで指定した値を条件に取得する方法を教えてください。
  • tbl1sテーブルの行をtbl2sテーブルのnameを検索条件にして取得したいです。
  • 具体的には、例えば「sato」を条件にした場合、tbl1sテーブルのidが1と3の行を取得したいです。
回答を見る
  • ベストアンサー

2つの関連するテーブルで指定した値を条件に取得したい

mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) name varchar(30) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl2s」 +------+-------+ |  id  | name | +------+-------+ |  1  | sato  | +------+-------+ |  2  | suzuki | +------+-------+ |  3  | tanaka | +------+-------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 1   | +------+-------+------+ 「tbl1s」テーブルの行を「tbl2s」テーブルのnameを検索条件にして取得したいのですが どのように記述すれば良いのでしょうか? 例えば「sato」を条件にした場合は、 テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  3  | +------+ を取得したいです。

  • MySQL
  • 回答数1
  • ありがとう数1

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

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

普通に考えれば、tbl1sのidではなくtbl1s_tbl2sのtbl1_idを抜く方が 現実的だと思います select distinct tbl1_id from tbl1s_tbl2s inner join tbl2s on tbl1s_tbl2s.tbl2_id=tbl2s.id and tbl2s.name='sato' どうしてもというのだったら冗長ですが select distinct tbl1s.id from tbl1s inner join tbl1s_tbl2s on tbl1s.id=tbl1s_tbl2s.tbl1_id inner join tbl2s on tbl1s_tbl2s.tbl2_id=tbl2s.id

takagoo100
質問者

お礼

ご回答ありがとうございます。 下の回答もあわせて、そのやり方を参考にしてできました。 ありがとうございます。

関連するQ&A

  • 2つの関連するテーブルで指定した値を条件orで取得したい

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) name varchar(30) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl1s」 +------+-------+ |  id  | club | +------+-------+ |  1  | 野球 | +------+-------+ |  2  | テニス| +------+-------+ |  3  | サッカー| +------+-------+ +------+-------+ テーブル「tbl2s」 +------+-------+ |  id  | name | +------+-------+ |  1  | sato  | +------+-------+ |  2  | suzuki | +------+-------+ |  3  | tanaka | +------+-------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 1   | +------+-------+------+ というテーブル構成で、「tbl1s」テーブルの行を 「tbl1s」のclubかない場合には「tbl2s」のnameを検索条件にして取得したいのですが どのように記述すれば良いのでしょうか? 例えば「テニス」を条件にした場合は、「tbl2s」のnameにはないですが「tbl1s」のclubには合致するのがあるので テーブル「tbl1s」 +------+ |  id  | +------+ |  2  | +------+ を取得したいです。

    • ベストアンサー
    • MySQL
  • 2つの関連するテーブルの並び替え

    mysql5.1.33を使用しています。 テーブル「tbl1」 id int(11) テーブル「tbl2」 id int(11) num1 int(11) テーブル「tbl1_tbl2」 id int(11) tbl1_id int(11) tbl1の外部キー tbl2_id int(11) tbl2の外部キー テーブル「tbl1」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ |  4  | +------+ テーブル「tbl2」 +------+------+ |  id  | num | +------+------+ |  1  | 5  | +------+------+ |  2  | 10  | +------+------+ |  3  | 50  | +------+------+ |  4  | 100 | +------+------+ テーブル「tbl1_tbl2」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 2   | +------+-------+------+ |  2  | 1    | 3   | +------+-------+------+ |  3  | 2    | 1   | +------+-------+------+ |  4  | 4    | 4   | +------+-------+------+ というテーブル構成で、tbl1の所有するtbl2のnum1の平均値によって降順にソートしたいのですが どのようなSQL文になるのでしょうか? 例えばこの場合では、 tbl1のid「1」は、(tbl1_tbl2のid1「1」のtbl2_idのnum(10)+ tbl1_tbl2のid1「2」のtbl2_idのnum(50))÷2=30 tbl1のid「2」は、(tbl1_tbl2のid1「3」のtbl2_idのnum(5))÷1=5 tbl1のid「3」は、tbl1_tbl2にないので=0 tbl1のid「4」は、(tbl1_tbl2のid1「4」のtbl2_idのnum(100))÷1=100 なので テーブル「tbl1」は +------+ |  id  | +------+ |  4  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ に並べ変えられた結果が得たいです。

    • ベストアンサー
    • MySQL
  • 別テーブルのカラムを利用してソートしたい

    別テーブルのカラムを利用してソートしたい MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」のcountというカラムを利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 「tbl2」のidというカラムは外部キーで「tbl1」のidと関係しています。 テーブル「tbl1」 +------+---------+ |   id |  userid  | +------+---------+ |  1  | tanaka  | |  2  | sato   | +------+---------+ テーブル「tbl2」 +------+---------+ |   id |  count  | +------+---------+ |  1  |   10  | |  2  |   3   | +------+---------+ 次のような文かなと思ったのですが、エラーが返ってきます・・・ SELECT * FROM tbl1 ORDER BY (SELECT id FROM tbl2 ORDER BY count)

    • ベストアンサー
    • MySQL
  • 複数テーブルをまとめてソート

    たとえば次のような、都道府県ごとのテーブルがあり、 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 データ取得

    db_name = AAA table_name = BBB _______ id name 1 tanaka 2 yamada 3 suzuki _______ 上記のidを指定して、 nameを取得するには どうしたらいいですか? 例)id = 1 を指定して返り値に   tanakaが代入される

    • 締切済み
    • PHP
  • 結合で重複のエラーが出る

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl2sbelongs」 id int(11) tbl2_id int(11) tbl2sの外部キー count int(11) テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl2s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 3   | +------+-------+------+ テーブル「tbl2sbelongs」 +------+-------+-------+ |  id  | tbl2_id | count | +------+-------+-------+ |  1  | 1    | 3   | +------+-------+------+ |  2  | 2    | 10  | +------+-------+------+ |  3  | 3    | 15  | +------+-------+------+ SELECT * FROM `tbl1s_tbl2s` AS `Tbl1sTbl2` INNER JOIN (SELECT *, sum(Tbl2sbelong.`count`) as sum FROM `tbl2s` AS `Tbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl2`.`id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `Tbl2`.`id` ) AS `SUB` ON (`Tbl1sTbl2`.`tbl2_id`=`SUB`.`id`) WHERE 1 = 1 GROUP BY `tbl1_id` を実行すると、 「SQL Error: 1060: Duplicate column name 'id' 」 というエラーが出てしまいます・・・ おそらくカラムのidが結合の中で重複しているという内容だと思うのですが、 3つもテーブルが絡んでくるとどれのidがというのが分からないのですが、 これは何が原因なのでしょうか? ちなみにサブクエリの SELECT *, sum(Tbl2sbelong.`count`) as sum FROM `tbl2s` AS `Tbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl2`.`id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `Tbl2`.`id` この段階までは実行できます。 最終的には、「tbl2sbelongs」テーブルの「count」の値によって、「tbl1s」を降順に並べ替えたいと思っています。 この例だと テーブル「tbl1s」 +------+ |  id  | +------+ |  3  |count = tbl2_id「3」の15 = 15 +------+ |  1  |count = tbl2_id「1」の3 + tbl2_id「2」の10 = 13 +------+ |  2  |count = 0 +------+

    • ベストアンサー
    • MySQL
  • 複数検索時の条件分岐について

    環境:php5、mysql5 条件検索はできるのですが検索状況の違いによる条件分岐について どなたがアドバイスをお願いします。 $sql内でWHERE以降を「 if ~ else ~ 」などを使って変更するか WHILE以降を変更する気がするのですがやり方がよくわかりません。 よろしくお願いします。 以下設定 テーブル  :tbl_item [int] フィールド1:item_id [int] フィールド2:cate_id [int] ←他テーブル(名前に変換) フィールド3:item_name [varchar] フィールド4:price [decimal] フィールド5:stock_id [int]   ←他テーブル 条件1:cate_id(プルダウン)を検索条件に加えている時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); 条件2:cate_id(プルダウン)を検索条件に加えていない時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ・ ・ アイテム数 <?= $num_rows ?> 種類 ・ ・ <? WHILE ( $item = mysql_fetch_array( $result ) ) { ?> ・ ・ ・ <? $n ++; } ?>

    • ベストアンサー
    • PHP
  • 2つのテーブルを結合する条件

    現在、MySQLを使用しており2つのテーブルの結合条件がわからないので教えてください。 name_masterとmeiboの2つのテーブルがあります。 meiboとname_masterを結合させてname_idとname_id2が日本語に置き換わった状態で 取得させたいと思っています。どのようにwhere句の条件を作成すればよいでしょうか。 取得する項目のイメージとしては以下の3つが取得できるようにしたいです。 「meibo.no, meibo.name_idの日本語, meibo.name_id2の日本語」 【name_masterテーブル】 id name 1  ポチ 2  タマ 3  ミケ 4  ハチ 5  タロウ 【meiboテーブル】 no  name_id  name_id2 1    3     1 2    4     2 3    5     3

    • ベストアンサー
    • MySQL
  • 3つの関連するテーブルから必要な情報を取り出す

    現在、データベースで小規模の検索システムを製作しているのですが、詰まってしまったところがあるので、質問をさせて頂きたいです。 まず、最初に取り出したいテーブルの構成を書きたいと思います。 "Tag" "Works" "EquipTag" の三つのテーブルがあり、 Tag /* Tagをあらわすテーブル*/ id: primaryキー name: 名前 created_at: 作成日 Works /* 作品を表すテーブル*/ id: primary キー name: 名前 created_at: 作成日 Equip_Tag /*作品とタグの関連を保存するテーブル*/ id: primaryキー works_id: 外部キー Worksのprimaryキーに対して tag_id: 外部キー Tagのprimaryキーに対して となっています。 上記のテーブルから、 「タグの名前に '%hoge%'を持ち、かつ、作品の名前に'%hogehoge%'を含む作品一覧」を取得したいのですが、どういった方法が考えられるでしょうか? また、Worksのidが同じものは2度表示しないようにしたいと考えています。 使用しているDBは、MySQL のバージョン5です。 どうか宜しくお願いします。

    • ベストアンサー
    • MySQL
  • カーソルで値取得

    あるテーブルから頭から10件分 カーソルで値を取得するようにしていましたが、 元々下記のようだったものを… CURSOR cursor_name IS SELECT TBL_A.E_ID,TBL_A.C_ID FROM (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10;     ↓ CURSOR cursor_name IS SELECT TBL_A.E_ID, TBL_M.S_ID, TBL_M.S_NAME, TBL_U.USER_ID FROM ((TBL_A INNER JOIN TBL_EU ON TBL_A.E_ID = TBL_EU.E_ID) INNER JOIN TBL_U ON TBL_EU.S_ID = TBL_U.S_ID) INNER JOIN TBL_M ON TBL_EU.S_ID = TBL_M.S_ID WHERE (((TBL_EU.DIVISION)="2")); というように取得する値をふやしたいのですが、元にあった (SELECT E_ID,C_ID,ROW_NUMBER() OVER( ORDER BY E_ID ) RN  FROM TBL_A) TBL_A WHERE RN BETWEEN 1 AND 10; をどこに組み込んでいいのかわらず困っております。 どなかた教えて頂けないでしょうか?お願いいたします。