• ベストアンサー

別のテーブルから数値を取得したい

リレーションか、結合どちらになるかわからないのですが、 たとえば例をあげると syohin:【商品リスト】と【荷物の大きさ】 souryou:【荷物の大きさ】と【送料】 というテーブルがあるとします。 syohin type ----------- 001 A 002 B 003 C type souryou -------------- A 500 B 1000 C 1500 SQL文で、syohinとsouryouを出力したいのですが、 (例:商品002のみ「商品名」と「送料」を出したい) syohin souryou ---------------- 002 1000 のですが、どのようなSQL文になるのでしょうか? これがリレーションであるならば、テーブルの作成時や、フィールドの作成時に何かしらのオプション設定が必要なのでしょうか?

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

select a.syohin, b.souryou from syohin a, souryou b where a.type = b.type and a.syohin = '002' でどうでしょう。

apricot777
質問者

補足

テーブル名を[a]=[syohin], [b]=[souryou]と考えました。テーブルは#1の補足の通りです。 mysql> select syohin.syohin, souryou.souryou from syohin syohin, souryou souryou where syohin.type = souryou.type and syohin.syohin = '002'; +--------+---------+ | syohin | souryou | +--------+---------+ | 002 | 1000 | +--------+---------+ 1 row in set (0.00 sec) 希望通りの結果が出ました、ありがとうございます。これだけでも「複雑になったなぁ」と躊躇してしまいましたが、もっと複雑怪奇なSQL文を使ってこそ、柔軟な検索ができるんでしょうね。 from syohin syohin, souryou souryou を from syohin, souryou に変えても同じ結果が出たのですが、上の2つはどう違うのでしょうか?

その他の回答 (2)

  • sakuhat
  • ベストアンサー率61% (11/18)
回答No.3

>from syohin syohin, souryou souryou を >from syohin, souryou に変えても同じ結果が出たのですが、上の2つはどう違うのでしょうか? SQLにasというコマンドがあります。 これは列名やテーブル名に別名をつけるものです。 たとえばchonagaitableとchonagaitable2というテーブルがあるとします。 通常は select chonagaitable.A, chonagaitable.C, chonagaitable.D, chonagaitable2.Z from chonagaitable,chonagaitable2 などとしますがこれだと長いテーブル名を いちいち書かなくてはなりません。 asで別名をつけてやると select cho.A, cho.C, cho.D, cho2.Z from chonagaitable as cho, chonagaitable2 as cho2 と短くできます。 MySQLの場合asは省略できます。 つまり from syohin syohin, souryou souryou は from syohin as syohin, souryou as souryou と同じです。 しかし、これだと同じ名前をつけているので asの意味がないですね。 だからfrom syohin, souryouだけでOKです。 上の例の場合2つのテーブルに同じ列名が無い なら「chonagaitable.」「cho.」などテーブル名は省略して select A, C, D, Z from chonagaitable,chonagaitable2 と書いても大丈夫です。 同じ列名がある場合はテーブル名を指定する必要があります。 その場合、asを使って列名にも別名をつけると便利です。 select cho.A as A1, cho2.A as A2, cho.C, cho.D, cho2.Z from chonagaitable as cho, chonagaitable2 as cho2 とすることでcho.AはA1という列名で cho2.AはA2という列名で表示されます。 こちらのasも省略できます。

apricot777
質問者

お礼

とても詳しいご説明感謝します。わかりやすくて納得することができました。ありがとうございます。

回答No.1

質問内容の結果を求めるには、 select syohin,souryou from syohin A,souryou B where A.type = B.souryou and A.type = B だと思います。

apricot777
質問者

補足

mysql> select * from syohin; +--------+------+ | syohin | type | +--------+------+ | 001 | A | | 002 | B | | 003 | C | +--------+------+ 3 rows in set (0.00 sec) mysql> select * from souryou; +------+---------+ | type | souryou | +------+---------+ | A | 500 | | B | 1000 | | C | 1500 | +------+---------+ 3 rows in set (0.00 sec) mysql> select syohin,souryou from syohin A, souryou B where A.type = B.souryou and A.t ype = 'B'; Empty set (0.00 sec) という結果になってしまいました。 mysql> select syohin,souryou from syohin A, souryou B; +--------+---------+ | syohin | souryou | +--------+---------+ | 001 | 500 | | 002 | 500 | | 003 | 500 | | 001 | 1000 | | 002 | 1000 | | 003 | 1000 | | 001 | 1500 | | 002 | 1500 | | 003 | 1500 | +--------+---------+ ここまでは、#2の方と書式は違うけれど、同じ結果が出ていますので、where句以降を修正すれば希望通りの結果が出ると思います。ヒントをいただきましてありがとうございます。

関連するQ&A