我有3张桌子:
php脚本会抛出找到的单词的定义。为了得到这个定义,我使用:
SELECT word.id_word,definition.data,definition.extra
FROM word LEFT OUTER JOIN definition ON word.id_word = definition.id_word
WHERE word.lang="en" AND word.word="arc"
目前,当我的表中不存在单词时,我调用外部api并将请求结果存储到表中。
为了避免对该api的持续失败请求,我设置了错误表。它包含用户搜索的所有新的非存在的单词(通过外部api)。为了避免重复对外部api的不必要的请求,我还需要先在错误表中检查该单词是否存在。如果存在,则意味着有人已经尝试过去搜索一个不存在的单词;而不是在api中再次搜索它(我每天的请求有限)我只能打印一个错误:“这个词并不意味着什么。”
如何检查同一查询中错误表中是否存在该单词?
答案 0 :(得分:1)
使用UNION
:
SELECT w.id_word, d.data, d.extra, false as is_error
FROM word w
LEFT JOIN definition d ON d.id_word = w.id_word
WHERE w.lang="en"
AND w.word="arc"
UNION
SELECT id_error, word, null, true
FROM error
WHERE lang="en"
AND word="arc";
这将返回:
is_error
列true
is_error
列false
答案 1 :(得分:0)
假设你使用id_word和id_error加入你的单词表和错误表,你可以做这样的事情。
SELECT word.id_word,definition.data,definition.extra
FROM word
INNER JOIN error ON error.word = word.word
LEFT OUTER JOIN definition ON word.id_word = definition.id_word
WHERE word.lang="en" AND word.word="arc"
如果id_word和id_error不相同,那么您需要修改SQL以使用加入列。
编辑:我已修改SQL以逐字加入单词上的错误表,我建议将word_id添加到错误表中,以便更好地加入。
答案 2 :(得分:0)
当错误表中出现该词时
SELECT W.id_word,D.data,D.extra
FROM
(
SELECT WK.id_word FROM
(SELECT id_word FROM word WHERE lang='en' AND word='arc') WK
INNER JOIN word USING (id_word)
LEFT JOIN error E ON word.word = E.word
WHERE E.word IS NOT NULL
) W
INNER JOIN definition D USING (id_word);
当错误表中没有该词
时SELECT W.id_word,D.data,D.extra
FROM
(
SELECT WK.id_word FROM
(SELECT id_word FROM word WHERE lang='en' AND word='arc') WK
INNER JOIN word USING (id_word)
LEFT JOIN error E ON word.word = E.word
WHERE E.word IS NULL
) W
INNER JOIN definition D USING (id_word);