MySQL加入禁止的单词表

时间:2011-11-29 21:47:53

标签: mysql join left-join

我有3张桌子:

  • 字:id_word,word(1,“arc”/ 2,“zoo”)
  • 定义:id_definition,id_word,data(1,1,“圆周的任何未完整部分”)
  • 错误:id_error,word(1,“ark”)

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中再次搜索它(我每天的请求有限)我只能打印一个错误:“这个词并不意味着什么。”

如何检查同一查询中错误表中是否存在该单词?

3 个答案:

答案 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_errortrue
  • 已知行的一行,is_errorfalse

答案 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);