2016-03-24 15 views
0

I持って、次の表:条件は、フィールドデータを使用して、JOIN

id, name, event_id

イベントを格納するために使用されます。id, title, owner_id誕生日、ワクチンなどのようなイベントを格納するために使用されます

オーナーid, nameオーナーを格納するために使用されます。元の所有者は、1

owner_eventのIDを持っている犬小屋です:元の所有者は、他の所有者の「に等しい「ウォークイベント」を検討するかもしれない。すなわち、お互いに様々な所有者のイベントを同一視するのに使用されoriginal_owner_event_id, other_owner_event_id遊びキャッチ "イベント。


参加すべて:

event.owner_id = owner.id

はここでトリッキーなPAだdog.event_id = event.id

所有者イベントに参加しイベントに参加しますRTowner_id > 1その後、イベントowner_event.other_owner_event_id = event.id

owner_eventをそれ以外の場合は参加すると

イベントowner_event.original_owner_event_id = event.idowner_eventに参加します。

SELECT * FROM dog 
LEFT JOIN event `event` ON `event`.id = dog.event_id 
LEFT JOIN owner `owner` ON `owner`.id = `event`.owner_id 
LEFT JOIN owner `owner_event_other` ON `owner_event_other`.other_owner_event_id = `event`.id AND `owner`.id > 1 
LEFT JOIN owner `owner_event_original` ON `owner_event_original`.original_owner_event_id = `event`.id AND `owner`.id = 1 
WHERE dog.id = 3 

私は実際に(例えば)犬3のために今event.titleを取得するかどうかはわかりません。


は、これまでのところ、私は次のよう持っています。

owner.idに応じて、event.idからowner_event.other_owner_event_idカラムまたはowner_event.original_owner_event_idカラムになる可能性があることに注意してください。

+0

あなたは 'owner'三回に参加します。私は最後の二つではなくowner_event''読んでくださいと仮定します。 – trincot

+0

ことがありますあなたが望む出力を正確には明らかにしない。その犬の所有者のリストにあるイベントのタイトルを表示するか、元の所有者のイベントのタイトルを常に表示しますか?すべてのテーブルと希望する出力に対して、いくつかのサンプル入力を提供してください。 – trincot

答えて

1

としてのみ、私は一度だけowner_eventに参加することを示唆している与えられたowner記録のために存在することができる2つの可能性のうちの1つが、チェーンevent、元の所有者のイベントを経由してタイトルを取得するために、それまで二時間(場合直接eventレコードは、そのタイトルを表すものではありません取得しました。COALESCEを使用すると、右のタイトルを選ぶことができます。

SELECT dog.*, 
      COALESCE(original_event.title, event.title) AS original_event_title 
FROM  dog 
LEFT JOIN event 
     ON event.id = dog.event_id 
LEFT JOIN owner 
     ON owner.id = event.owner_id 
LEFT JOIN owner_event 
     ON owner_event.other_owner_event_id = event.id 
LEFT JOIN event original_event 
     ON original_event.id = owner_event.original_owner_event_id 
WHERE  dog.id = 3 
+0

これは暗闇の中でのショットかも知れませんが、何らかの理由でLEFT JOINのowner_event部分のコメントを外すと、そこには存在しないはずの追加のレコードが返されます。これは、** owner_event **に、さまざまな 'other_owner_event_id'フィールドに同じ' original_owner_event_id'値が含まれているためです。 'original_owner_event_id'が使用されるとき、' other_owner_event_id'は '0'になる傾向があります。 – Hooli

+0

実際にそのテーブルをSQLに含める必要がある理由を説明できますか?そのテーブルのどの情報を実際に使用していますか? – trincot

+0

'owner_event.original_owner_event_id'に関連付けられた' event.title'が常に必要です。この問題は、 'event.id'が' owner_event.original_owner_event_id'に見つからないときに 'owner_event.other_owner_event_id'にあるために起こります。だからときどき、 'owner_event.other_owner_event_id'と関連する' owner_event.original_owner_event_id'値を見つける必要があります。 – Hooli

関連する問題