MYSQL - 想要选择一些行,有时候字段不会出现,但我想在那个字段上使用WHERE

时间:2012-05-06 05:33:21

标签: mysql sql left-join

好的,这很难解释......

我有以下表格:

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有关。

问题是有时在word_progress中没有user_id和word_id的条目。但是当它在那里时,我想能够在查询的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条目

我该怎么做?

2 个答案:

答案 0 :(得分:2)

您已经离开加入,所以当没有可用数据时,您只需null作为word_progress - 字段的值。只需检查一下:

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

另一种方法是将用户限制直接添加到join - 这样的标准:

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

并从where - 部分中删除该条件。

请注意,在这两种情况下,您都必须在代码中正确处理null progress个案例。

答案 1 :(得分:0)

是的,这是不明确的:“我想能够在查询的WHERE部分使用word_progress。但如果它不在那里,我不会。”

在左连接中, 如果没有word_progress匹配一个单词,你仍然会得到一个单词的结果行,只是word_progress的所有字段都将为空。

同样的word_set:没有相应的word_set,然后是word_set.id,其余的都是null。

所以在你的where子句中包含'is null'或'is not null'取决于你想要的东西....想想那个案例,那就是你留下的含糊不清的东西。或者记住,如果a或b为空(即使它们都为空),'a = b'为假,所以设计你的where子句以适应。