Я работаю над системой поиска/метки. Мой первоначальный запрос, который я написал, был для того, когда я хранили «заголовок», «описание» и столбец «теги», разделенные запятыми в моей статье/видео таблице. С тех пор я понял преимущество нормализации моих тегов. Теперь у меня есть три таблицы, чтобы иметь дело с ...mysql - результаты возврата, сгруппированные в столбце
tbl_Articles
- article_id
- название
- описание
- содержание
tbl_tag_index
- tag_id (суррогатный первичный ID)
- tag_type (равно 1 для tbl_Articles, 2 для tbl_videos)
- tag_word_id (смотрите таблицу ниже)
- tag_target_id (article_id/video_id - зависит от tag_type)
tbl_tag_word
- tag_word_id
- tag_word (наконец фактический тэг)
Этот запрос возвращает теги ... только проблема возвращает их в разные строки. Я думаю, мне нужно, чтобы результаты были сгруппированы в той же строке, так что мой поисковый запрос может работать
SELECT *
FROM `tbl_articles` A
JOIN `tag_index` I ON A.article_id = I.tag_target_id
JOIN tag_word W ON I.tag_word_id = W.tag_word_id
WHERE I.tag_type_id = 1
Вот мой старый поисковый запрос
SELECT *,
(
(CASE WHEN `description` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%dog%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%dog%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%dog%' THEN 1 ELSE 0 END)
) AS relevance
FROM `tbl_Articles`
WHERE `description` LIKE '%hotel%'
OR `description` LIKE '%london%'
OR `description` LIKE '%lazy%'
OR `description` LIKE '%dog%'
OR `title` LIKE '%hotel%'
OR `title` LIKE '%london%'
OR `title` LIKE '%lazy%'
OR `title` LIKE '%dog%'
OR `tags` LIKE '%hotel%'
OR `tags` LIKE '%london%'
OR `tags` LIKE '%lazy%'
OR `tags` LIKE '%dog%'
ORDER BY relevance DESC
LIMIT 0 , 10;
Обновлено основанный на комментарии о расчете релевантности тегов. –