1

私は次のデータベーススキーマを持っています:

スキーマ 高解像度画像はこちらhttp://s18.postimage.org/mlyw5gea1/schema2.png

ご覧のように :

スピーカーはセッションに直接関連付けられます。

セクションはセッションに直接関連付けられます。

スピーカーは、speakerFunction を介してセクションに間接的に関連付けられ、次に section_speakerfunction-join-table を介してセクションに関連付けられます。

間接セッションが直接セッションの 1 つでないすべてのスピーカーを取得する方法

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

0

残念ながら、私はあなたのグラフィックをズームすることができないので、以下は少し推測を必要としました。

すでに述べたように、特定のセッションから関連する講演者に到達するには2つの方法があります。まず、セッションに直接関連付けられているスピーカーのリストを取得できます。

SELECT speaker.* FROM `session-speaker-join-table`
JOIN speaker 
  ON speaker.id=`session-speaker-join-table`.speaker_id
WHERE `session-speaker-join-table`.session_id=1234

そして、スピーカー機能を介して間接的にリンクされたスピーカーのリストを取得する方法は次のとおりです。

SELECT speaker.* FROM section
JOIN `section-speakerfunction-join-table` 
  ON `section-speakerfunction-join-table`.section_id=section.id
JOIN speakerfunction 
  ON speakerfunction.id=`section-speakerfunction-join-table`.speakerfunction_id
JOIN speaker 
  ON speaker.id=speakerfunction.speaker_id
WHERE section.session_id=1234

編集:コメントを読んだ後、クエリ2の結果からクエリ1の結果を引いたものが必要だと理解しました。これはLEFT JOIN、2番目のクエリにを追加し、次のように一致するものがないかどうかを確認することで実現できます。

SELECT speaker.* FROM section
JOIN `section-speakerfunction-join-table` 
  ON `section-speakerfunction-join-table`.section_id=section.id
JOIN speakerfunction 
  ON speakerfunction.id=`section-speakerfunction-join-table`.speakerfunction_id
JOIN speaker 
  ON speakerfunction.speaker_id = speaker.id
LEFT JOIN `session-speaker-join-table` 
  ON `session-speaker-join-table`.session_id=section.session_id 
 AND `session-speaker-join-table`.speaker_id=speaker.speaker_id
WHERE section.session_id=1234 AND `session-speaker-join-table`.speaker_id IS NULL

(テーブル名も変更し、バッククォートを含めました。すべてをキャッチできたと思います。また、読みやすくするためにクエリを再フォーマットしました。)

于 2013-03-18T21:28:36.690 に答える
0

A Visual Explanation of SQL Joinsとnet.tutsplusに関するこの明確な記事を読んで記憶をリフレッシュした後、機能するクエリを作成することができました。

select * from Speaker as spk
内部結合スピーカーspkfunとして機能
    オン (spkfun.speaker_id = spk.id)
内部結合 section_speakerfunction-join-table as s_spkfun
    オン (s_spkfun.speakerFunction_id = spkfun.id)
内部結合セクション as s
    オン (s.id = s_spkfun.section_id)
sess1 としての内部参加セッション
    オン (sess1.id = s.session_id)
sess-spk として session-speaker-join-table に参加したまま
    オン (sess-spk.speaker_id = spk.id)
sess2 として参加セッションを終了しました
    オン (sess2.id = sess-spk.session_id)
sess-spk.session_id が null の場合

ご覧のとおり、多くの内部結合と、null session_id でフィルター (where 句) を実行できる左外部結合があります。

皆さんありがとう!

于 2013-03-20T01:41:32.233 に答える