MySQL не нравится запрос не работает - PullRequest
2 голосов
/ 01 февраля 2009

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

  • сообщения
  • метка

Таблица тегов имеет следующую структуру:

  • post_id
  • бирка

Так что для каждого тега, который дается для сообщения, я создаю запись в таблице тегов. Если запись имеет 10 тегов, в таблице тегов будет 10 записей с этим post_id.

Сейчас я пытаюсь создать страницу поиска, где пользователи могут выполнять поиск сообщений, в которых теги не содержат заданных ключевых слов. Это создает проблему, хотя. Запрос типа:

SELECT DISTINCT posts.id, posts.title, posts.content
   FROM jobs, tags
   WHERE tags.tag NOT LIKE '%$keywords%' AND posts.id=tags.post_id

не работает, потому что если в сообщении есть 6 тегов, а в одном из них есть ключевое слово, оно все равно будет возвращено, поскольку остальные 5 записей в таблице тегов не имеют этого ключевого слова.

Какой лучший способ решить это? Любой способ, кроме создания нового столбца в таблице сообщений, в котором хранятся все разделенные запятыми теги, используемые только для поиска ??

1 Ответ

7 голосов
/ 01 февраля 2009

Убедитесь, что у вас есть индексы, иначе это будет работать очень плохо:

SELECT posts.id, posts.title, posts.content
FROM posts 
WHERE NOT EXISTS (
  SELECT post_id from tags
  WHERE tags.tag LIKE '%$keywords%' 
    AND posts.id=tags.post_id
)

Получает список всех сообщений, кроме тех, которые имеют тег, соответствующий указанному вами тегу. (Ваш оригинальный запрос ссылался на таблицу «jobs». Я предположил, что это опечатка для «posts».)

Псевдонимы таблицы делают это немного чище:

SELECT p.id, p.title, p.content
FROM posts p
WHERE NOT EXISTS (
  SELECT t.post_id from tags t
  WHERE t.tag LIKE '%$keywords%' 
    AND p.id=t.post_id
)

Тогда я бы создал эти индексы:

Posts: id, tag_id
Tags: post_id, tag

Затем запустите ваш запрос с ' объяснение ', чтобы увидеть, хорошо ли он работает. Обновите свой вопрос с результатами, и кто-то предложит дальнейшие советы. Настройка индекса является скорее методом проб и ошибок, чем что-либо еще, поэтому тестирование действительно необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...