mysql - возвращает результаты, сгруппированные в столбце - PullRequest
2 голосов
/ 14 января 2010

Я работаю в системе поиска / тегов. Мой оригинальный запрос, который я написал, был для меня, когда я хранил столбцы «заголовок», «описание» и разделенные запятыми «теги» в моей таблице статей / видео. С тех пор я осознал преимущество нормализации моих тегов. Теперь у меня есть три таблицы, чтобы иметь дело с ...

tbl_Articles

  • article_id
  • название * * 1 010
  • описание
  • содержание

tbl_tag_index

  • tag_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;

1 Ответ

3 голосов
/ 14 января 2010

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

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
...