MySQL多列REGEXP匹配:基于标题/标签获取Post ID的查询方案
三种帖子搜索场景的SQL实现方案
没问题,针对你提出的三种搜索需求,我结合你的表结构整理了对应的SQL代码,直接就能套用:
首先先明确你的表结构(方便对照):
-- post表:存储帖子基本信息 CREATE TABLE post ( post_id INT PRIMARY KEY, post_title VARCHAR(255) ); -- tags表:存储标签信息 CREATE TABLE tags ( tag_id INT PRIMARY KEY, tag_name VARCHAR(50) ); -- post_tags表:帖子与标签的关联关系表 CREATE TABLE post_tags ( post_id INT, tag_id INT, PRIMARY KEY (post_id, tag_id), FOREIGN KEY (post_id) REFERENCES post(post_id), FOREIGN KEY (tag_id) REFERENCES tags(tag_id) );
1. 仅匹配帖子标题
直接查询post表,筛选标题包含目标关键词的帖子ID即可:
SELECT post_id FROM post WHERE post_title LIKE '%your_search_keyword%';
示例:如果搜索关键词是car,会返回post_id = 1(对应你的示例数据里的"my new super car")。
2. 仅匹配关联标签
需要通过关联表找到对应标签的帖子,用DISTINCT避免同一个帖子被多次返回(因为一个帖子可能关联多个标签):
SELECT DISTINCT pt.post_id FROM post_tags pt JOIN tags t ON pt.tag_id = t.tag_id WHERE t.tag_name LIKE '%your_search_keyword%';
示例:如果搜索关键词是red,会返回post_id = 1(对应关联的标签ID 5)。
3. 同时匹配标题和标签
同时满足标题包含指定关键词且关联标签包含指定关键词,通过多表关联实现:
SELECT DISTINCT p.post_id FROM post p JOIN post_tags pt ON p.post_id = pt.post_id JOIN tags t ON pt.tag_id = t.tag_id WHERE p.post_title LIKE '%title_keyword%' AND t.tag_name LIKE '%tag_keyword%';
示例:如果标题关键词用car,标签关键词用red,会返回post_id = 1,因为它同时满足两个条件。
如果你的数据量比较大,想要更高效的搜索,可以考虑给post_title和tag_name字段建立全文索引,然后使用MATCH() AGAINST()语法替代LIKE,不过对于中小规模的数据,上面的代码已经足够好用了。
内容的提问来源于stack exchange,提问作者max
相关产品推荐
相关产品推荐

