2009-07-10 19 views
2

は、あなたがこのように構成アイテム、イベント、およびシートという名前の3つのテーブルを持っているとしましょう:MySQLを使用して、3番目のテーブルとの関係に基づいて2つのテーブルを結合できますか?

項目
ID(int型)
EVENT_ID(int型)
節(INT)

イベント
ID(int型)
Venue_id(int型)
構成(int型)

シート
ID(int型)
Venue_id(int型)
構成(int型)
節(INT)
Face_value(int型)

私が構築しようとしていますItemテーブルからすべてのエントリを取得し、各アイテムのFace Valueを含むMySQLクエリ。これを行うために、クエリがなければなりません:

  1. はItem.Event_id値を使用して、イベント・テーブル内のそのエントリのEvent.Id
  2. にそれを一致させる、それがEvent.Venue_idとイベントを取る必要があります。構成と両方のANDの値が同じであるシートテーブルのエントリを見つけると、Itemのセクションと同じ値を持ちます。 Face_valueを返さなければなりません。

私は、3つのテーブルすべての情報を組み合わせる方法のために、これを構築するのに苦労しています。どのようにそれにアプローチする上の任意のアイデア?あるいは、これはSQLでは不可能ですか?

答えて

4
SELECT `Item`.*, `Seat`.`Face_value` 
FROM `Item` 
JOIN `Event` ON `Event`.`Id` = `Item`.`Event_id` 
JOIN `Seat` USING (`Venue_id`, `Configuration`) 
WHERE `Seat`.`Section` = `Item`.`Section` 
+0

おかげトン:-)この構文を好みます。私はなぜこれが機能するのか理解しようとしています - 私はJOINの問題の順序を仮定していますよね?このように、mysqlはUSINGコマンドがSeatとEventテーブルの同じ名前の変数を参照していることを知っていますか? – Jack7890

+0

それは多少問題です。 USINGはJOINのどちらかの側に存在する同じ名前の列を必要とします。ただし、Adam Bernierの説明のように、クエリを異なる順序で結合するように書き直すことはできますが、USINGは便宜上のものです。私はそれを直感的な方法で書きました。 – chaos

+0

カオスは素晴らしいです!私はちょうどMySQLを学び始めて、あなたがやったことをやろうとしていますが、頭や尻尾を作ることはできません。私はまだJOINを完全に理解していません。 :-) – enchance

1
chaosと同じ

、私は

select s.Section, s.Configuration, s.Face_value 
from Item i 
     inner join Event e 
     on e.id = i.Event_id 
     inner join Seat s 
     on s.Venue_id = e.Venue_id 
    and 
     s.Configuration = e.Configuration 
    and 
     s.Section = i.Section 
+0

ありがとうございます。これとカオスの答えの主な違いは、JOINではなくINNER JOINを使用し、 "s.Section = i.Section"部分をWHERE句からON句に移動することです。これらの変更のいずれかがパフォーマンスを傷つけたり改善したりしますか? – Jack7890

+0

修飾子なしでJOINを書くときのINNER JOINはデフォルトです。したがって、実際には違いはありません。私たちはどちらも内部結合を使用しています。私はWHERE対ONがパフォーマンスに影響するとは思っていませんが、不可能ではありません。私は両方を実行することをお勧めします。 :)(そしておそらくそれらも説明しています。) – chaos

+0

それをWHEREに含めれば、より速く走っているようです。面白い。 – Jack7890

関連する問題