1

わかりました、これは説明するのが難しいです...

私は次のテーブルを持っています:

table : words
table: word_progress
table: word_set

foreign keys:
words.id = word_set.word_id
word_progress.word_id = words.id
word_progress.user_id = users.id

基本的に、単語は word_set にあります。word_progress (特定の単語のスコアを保持します) は、user_id と word_id に関連しています。

問題は、user_id と word_id の word_progress にエントリがない場合があることです。しかし、そこにある場合は、クエリの WHERE 部分で word_progress を使用できるようにしたいと考えています。しかし、そこにない場合はいけません。現時点での私の回避策は、ステートメントを実行する前です。「IGNORE IF EXISTS を work_progress (word_id,user_id) 値 (?,?) に挿入」して、そこにあることを確認します。

私はこのクエリを持っています

select 
words.* , 
word_progress.progress from words

left join word_progress on word_progress.word_id = words.id
left join word_set on word_set.id = words.word_set_id        

where word_set.id = ?  and word_progress.user_id = ?

しかし...問題は、その単語のword_progressエントリがない場合があることです

これどうやってするの?

4

2 に答える 2

2

すでに左結合しているため、利用可能なデータがない場合は、 -fieldsnullの値として取得するだけです。word_progress次のように確認してください:

...
and
  (
    word_progress.user_id is null
  or
    word_progress.user_id = ?
  )

join別の方法は、次のようにユーザー制限を -criteriaに直接追加することです。

...
left join word_progress
  on word_progress.word_id = words.id
  and word_progress.user_id = ?
...

where-partからその基準を削除します。

どちらの場合も、コードの後半でnull-cases をprogress適切に処理する必要があることに注意してください。

于 2012-05-06T05:37:07.277 に答える
0

ええ、これはあいまいです: 「クエリの WHERE 部分で word_progress を使用できるようにしたいのですが、そこにない場合は使用できません。」

左の結合では、単語に一致する word_progress がない場合でも、その単語の結果行が得られます。それは、word_progress のすべてのフィールドが null になるということだけです。

word_set についても同様です: 対応する word_set がない場合、word_set.id と残りはすべて null です。

そのため、必要に応じてwhere句に「is null」または「is not null」を含めます....その場合について考えてください。それはあいまいなままです。または、a または b のいずれかが null の場合 (両方が null であっても)、'a = b' は false であることを覚えておいてください。そのため、where 句が適合するように設計してください。

于 2012-05-06T05:57:22.193 に答える