为了解决动态关键词匹配的需求,我们需要创建一个关键词表(keywords_table
),其中存储关键词和对应的类别。以下是具体的步骤:
1. 创建关键词表
可以用以下 SQL 创建一个简单的关键词表:
sql
CREATE TABLE keywords_table (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键
category VARCHAR(50) NOT NULL, -- 类别名称
keyword VARCHAR(255) NOT NULL -- 关键词
);
2. 插入关键词数据
根据需求插入对应的关键词和类别:
sql
INSERT INTO keywords_table (category, keyword)
VALUES
('类别 A', '关键词1'),
('类别 A', '关键词2'),
('类别 B', '关键词3'),
('类别 B', '关键词4');
3. 示例主表
假设主表为 your_table
:
sql
CREATE TABLE your_table (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键
info VARCHAR(255) NOT NULL -- 包含描述的字段
);
插入示例数据:
sql
INSERT INTO your_table (info)
VALUES
('关键词1,关键词4'),
('关键词2'),
('关键词3'),
('无匹配关键词');
4. 用 JOIN 查询匹配关键词类别
sql
SELECT
t.id,
t.info,
GROUP_CONCAT(DISTINCT k.category) AS 匹配类别 -- 聚合匹配的类别,避免重复
FROM your_table t
LEFT JOIN keywords_table k
ON t.info LIKE CONCAT('%', k.keyword, '%') -- 动态匹配关键词
GROUP BY t.id, t.info;
查询结果示例
基于上述数据,查询结果可能如下:
id | info | 匹配类别 |
---|---|---|
1 | 关键词1,关键词4 | 类别 A, 类别 B |
2 | 关键词2 | 类别 A |
3 | 关键词3 | 类别 B |
4 | 无匹配关键词 | NULL |
关键点说明
- 关键词动态匹配 :
ON t.info LIKE CONCAT('%', k.keyword, '%')
用于动态检测info
是否包含某个关键词。 - 去重类别 :
GROUP_CONCAT(DISTINCT k.category)
保证返回的类别不重复。 - 未匹配处理 :
LEFT JOIN
保证即使没有匹配到关键词,your_table
的数据仍会显示,匹配结果为NULL
。
优化建议
- 如果
info
数据非常大,建议在逻辑层(如代码中)拆分匹配,而不是完全依赖 SQL。 - 可以为
keywords_table.keyword
创建索引以优化性能,特别是关键词较多时:
sql
CREATE INDEX idx_keyword ON keywords_table (keyword);