【问题标题】:mysql - return results grouped in a columnmysql - 返回分组在列中的结果
【发布时间】:2011-01-05 05:23:52
【问题描述】:

我正在开发一个搜索/标签系统。我写的原始查询是在我的文章/视频表中存储“标题”、“描述”和逗号分隔的“标签”列时。从那以后,我意识到标准化标签的好处。我现在要处理三个表...

tbl_Articles

  • article_id
  • 标题
  • 说明
  • 内容

tbl_tag_index

  • tag_id(代理主 ID)
  • tag_type(对于 tbl_Articles 等于 1, 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;

【问题讨论】:

  • 根据标签相关性计算的评论更新。

标签: php mysql search search-engine


【解决方案1】:

用途:

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

【讨论】:

  • 哇,太棒了!我如何整合类似的标题和描述?
  • 对不起,也许我的帖子不清楚,我仍然希望搜索相同的内容,只是标签不是列在单独的表格中。谢谢。
  • 您的解决方案比我的更有效。我仍然看不到'COUNT(DISTINCT w.tag_word)'将如何搜索标签与搜索词的相似度:S
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多