You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:41:14