2012-05-06 1 views
1

あるとき、私はOK、これは説明するのは難しいです、そのフィールドにWHEREを使用したい...MYSQL - 私は時々、フィールドが存在しませんが、いくつかの行を選択したいが、それはそこに

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_progress(特定の単語のスコアを保持する)はuser_idとword_idに関係します。

user_idとword_idのword_progressに問題があることがあります。それがそこにあるとき、私は質問のWHERE部分でword_progressを使用できるようにしたいと思います。それがなければ私はしません。現時点では周りの私の仕事は、私は「IFはwork_progressにEXISTS IGNORE挿入(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エントリが存在しないのですか?

+0

JOIN基準の一部として 'word_progress.user_id =? 'を入力できませんか? –

+0

特定の行のフィールドに利用可能なデータがない場合、NULLを取得するだけです。 –

答えて

2

既に参加していますので、利用可能なデータがない場合は、word_progress -fieldsの値としてnullと表示されます。

... 
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からその基準をドロップするだけで、このようなことを確認してください。

どちらの場合でも、progressの場合はnullケースをコード内で正しく処理する必要があります。何word_progressはありません場合は、左側にある「私がしたいクエリのWHEREの部分にword_progressを使用することができるが、それがない場合、私はいけない。。」

参加し、 :

0

ええ、これは曖昧です単語に一致させるには、単語の結果行が表示されますが、word_progressのすべてのフィールドはnullになります。

word_setと同じです:対応するword_setと、word_set.idと、それ以外はすべてnullです。

あなたが望むものに応じてwhere句に 'is null'または 'not null'を含めると...そのケースについて考えると、それはあいまいになります。 aまたはbがnullの場合(たとえそれらが両方ともnullであっても) 'a = b'がfalseであることを覚えておいてください。

関連する問題