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_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 条目

我怎样才能做到这一点?

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 的所有字段都将为空。

word_set 也一样:没有对应的 word_set,那么 word_set.id 和其余的都是空的。

所以在你的 where 子句中包含 'is null' 或 'is not null' 取决于你想要什么......想想那个案例,这就是你留下的模棱两可的地方。或者请记住,如果 a 或 b 为空(即使它们都为空),则 'a = b' 为假,因此请设计适合的 where 子句。

于 2012-05-06T05:57:22.193 回答