2010-01-14 3 views
2

Я работаю над системой поиска/метки. Мой первоначальный запрос, который я написал, был для того, когда я хранили «заголовок», «описание» и столбец «теги», разделенные запятыми в моей статье/видео таблице. С тех пор я понял преимущество нормализации моих тегов. Теперь у меня есть три таблицы, чтобы иметь дело с ...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; 
+0

Обновлено основанный на комментарии о расчете релевантности тегов. –

ответ

3

Использование:

SELECT A.*, 
     GROUP_CONCAT(DISTINCT w.tag_word ORDER BY w.tag_word ASC SEPARATOR ',') AS tags, 
     COUNT(DISTINCT w.tag_word) + 
     (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) AS relevance 
    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 
    AND w.tag_word IN ('hotel', 'london', 'lazy', 'dog') 
GROUP BY a.article_id, a.title, a.description, a.content 
ORDER BY relevance DESC 
+0

ничего себе, это просто фантастика! Как я могу интегрировать название и описание? – Mark

+0

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

+0

Я получил его работу ... Спасибо. – Mark

Смежные вопросы