MySQL объединяется с таблицей запрещенных слов - PullRequest
0 голосов
/ 30 ноября 2011

У меня есть 3 таблицы:

  • слово: id_word, слово (1, "дуга" / 2, "зоопарк")
  • определение: 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, я установил таблицу error . Он содержит все новые несуществующие слова, которые пользователи ищут (через внешний API). Чтобы избежать повторных ненужных запросов к внешнему API, мне также необходимо предварительно проверить, существует ли слово в таблице ошибок. Если оно существует, это означает, что кто-то уже пытался найти несуществующее слово в прошлом; и вместо того, чтобы искать его снова в API (у меня есть ограниченные запросы в день), я могу просто напечатать ошибку: «это слово ничего не значит».

Как я могу проверить, существует ли слово в таблице ошибок в том же запросе?

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Использовать 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
0 голосов
/ 30 ноября 2011

Когда слово присутствует в таблице ошибок

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);
0 голосов
/ 30 ноября 2011

Если вы используете 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 в таблицу ошибок, чтобы у вас было лучшее соединение.

...