0

我的博客/标签有 3 个表格

lm_blog、lm_blog_tags 和 lm_blog_tag_relationships。

我现在正在尝试添加一个使用布尔搜索的搜索功能。我明白了,但我也无法让它搜索标签。

SELECT blog.blog_id, title, url, summary, 
GROUP_CONCAT(tags.tag SEPARATOR ':') AS tags, 
MATCH(title) AGAINST ($query IN BOOLEAN MODE) AS title_rel, 
MATCH(summary) AGAINST ($query IN BOOLEAN MODE) AS summary_rel, 
MATCH(article) AGAINST ($query IN BOOLEAN MODE) AS article_rel 
FROM lm_blog AS blog
INNER JOIN lm_blog_tag_relationships AS rel 
ON blog.blog_id = rel.blog_id 
INNER JOIN lm_blog_tags AS tags 
ON rel.tag_id = tags.tag_id
WHERE MATCH(title, summary, article) AGAINST ($query IN BOOLEAN MODE)
GROUP BY blog.blog_id 
ORDER BY title_rel DESC, summary_rel DESC, article_rel DESC, blog.updated DESC 

我尝试添加另一个WHERE子句以匹配聚合标签,但您不能在 where 子句中使用组数据。据我所知,没有办法做WHERE OR HAVING...

这是我得到的最接近的,但它会检查 WHERE 和 HAVING。我需要一个 WHERE 或 HAVING

SELECT blog.blog_id, title, url, summary, 
GROUP_CONCAT(tags.tag SEPARATOR ':') AS tags, 
MATCH(title) AGAINST ($query IN BOOLEAN MODE) AS title_rel, 
MATCH(summary) AGAINST ($query IN BOOLEAN MODE) AS summary_rel, 
MATCH(article) AGAINST ($query IN BOOLEAN MODE) AS article_rel 
FROM lm_blog AS blog
INNER JOIN lm_blog_tag_relationships AS rel 
ON blog.blog_id = rel.blog_id 
INNER JOIN lm_blog_tags AS tags 
ON rel.tag_id = tags.tag_id
WHERE MATCH(title, summary, article) AGAINST($query IN BOOLEAN MODE)
GROUP BY blog.blog_id 
HAVING tags LIKE $query 
ORDER BY title_rel DESC, summary_rel DESC, article_rel DESC, blog.updated DESC 
4

1 回答 1

0

经过几个小时的搜索,找到了答案……其实很简单。只需选择一个带标签的选项,然后选择一个带全文搜索的选项,然后使用 UNION DISTINCT 将它们连接起来。

SELECT blog.blog_id, title, url, summary, updated, 
GROUP_CONCAT(tags.tag SEPARATOR ':') AS tags, 
MATCH(title) AGAINST ($query IN BOOLEAN MODE) AS title_rel, 
MATCH(summary) AGAINST ($query IN BOOLEAN MODE) AS summary_rel, 
MATCH(article) AGAINST ($query IN BOOLEAN MODE) AS article_rel 
FROM lm_blog AS blog
INNER JOIN lm_blog_tag_relationships AS rel 
ON blog.blog_id = rel.blog_id 
INNER JOIN lm_blog_tags AS tags 
ON rel.tag_id = tags.tag_id
WHERE MATCH(title, summary, article) AGAINST ($query IN BOOLEAN MODE) 
GROUP BY blog.blog_id 

UNION DISTINCT

SELECT blog.blog_id, title, url, summary, updated, 
GROUP_CONCAT(tags.tag SEPARATOR ':') AS tags,  
MATCH(title) AGAINST ($query IN BOOLEAN MODE) AS title_rel, 
MATCH(summary) AGAINST ($query IN BOOLEAN MODE) AS summary_rel, 
MATCH(article) AGAINST ($query IN BOOLEAN MODE) AS article_rel 
FROM lm_blog AS blog
INNER JOIN lm_blog_tag_relationships AS rel 
ON blog.blog_id = rel.blog_id 
INNER JOIN lm_blog_tags AS tags 
ON rel.tag_id = tags.tag_id
GROUP BY blog.blog_id 
HAVING tags REGEXP $query

ORDER BY title_rel DESC, summary_rel DESC, article_rel DESC, updated DESC

它看起来不像我可以使用HAVING ... MATCH ... AGAINST ...,所以我将为此使用正则表达式,直到找到解决方案。

于 2013-11-11T02:21:42.807 回答