好的,这很难解释......
我有以下表格:
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条目
我该怎么做?
答案 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子句以适应。