MySQL查询:如何忽略变量中的DE/(DE)词汇匹配目标记录?
解决含DE/(DE)词汇的模糊查询问题
问题背景
现有MySQL表t_vias,表结构及初始化数据如下:
CREATE TABLE `t_vias` ( `id` int(11) NOT NULL, `cpro` varchar(2) NOT NULL, `cmum` varchar(3) NOT NULL, `cpos` varchar(5) NOT NULL, `mun` varchar(75) NOT NULL, `via` varchar(100) NOT NULL); INSERT INTO t_vias VALUES ("6021","28","079","28016","MADRID","GOYA, FRANCISCO DE"), ("6022","28","079","28016","MADRID","FRANCISCO GOYA"), ("6896","28","079","28001","MADRID","GOYA, DE"), ("6897","28","079","28001","MADRID","GOYA (DE)"), ("6900","28","079","28001","MADRID","CALLE GOYA"), ("6901","28","079","28001","MADRID","CALLE DE GOYA");
当前查询存在的问题:
- 当PHP变量为
CALLE DE GOYA时,精确查询SELECT * FROM t_vias WHERE via = 'CALLE DE GOYA';能正确返回对应记录; - 模糊查询
SELECT * FROM t_vias WHERE via LIKE '%GOYA%';能返回所有含GOYA的记录; - 但当变量为
DE GOYA时,执行SELECT * FROM t_vias WHERE via LIKE '%DE GOYA%';仅返回1条记录,无法匹配其他含GOYA但DE位置不同的记录。
需求:当查询变量包含DE、(DE)这类词汇时,忽略这些词汇,仅查询包含核心词汇(如GOYA)的所有记录。
解决方案
方法1:PHP端预处理查询字符串,提取核心词汇
在应用层先对输入变量做清洗,移除无关词汇后再拼接查询语句,逻辑更清晰且性能更优:
$input = "DE GOYA"; // 定义需要过滤的无关词汇 $filterWords = ['DE', '(DE)']; // 替换无关词汇为空,再清理多余空格并拆分出核心关键词 $processedStr = str_replace($filterWords, '', $input); $keywords = array_filter(explode(' ', trim($processedStr))); // 拼接多关键词模糊查询语句(支持多个核心词汇) $sql = "SELECT * FROM t_vias WHERE via LIKE '%".implode("%' AND via LIKE '%", $keywords)."%';";
方法2:MySQL端直接处理字段或查询参数
如果需要在SQL层面完成处理,可以使用REPLACE函数移除无关内容后匹配:
-- 直接处理表字段,移除DE/(DE)后匹配核心词汇 SELECT * FROM t_vias WHERE REPLACE(REPLACE(via, '(DE)', ''), 'DE', '') LIKE '%GOYA%';
若查询参数是动态传入的,也可以先处理参数再匹配:
SET @input = 'DE GOYA'; -- 清理参数中的无关词汇 SET @cleanInput = TRIM(REPLACE(REPLACE(@input, '(DE)', ''), 'DE', '')); -- 拼接模糊匹配规则 SET @matchPattern = CONCAT('%', @cleanInput, '%'); SELECT * FROM t_vias WHERE via LIKE @matchPattern;
方法3:正则表达式匹配(MySQL 8.0+适用)
如果需要更灵活的匹配规则,可使用REGEXP函数直接匹配核心词汇:
SELECT * FROM t_vias WHERE via REGEXP 'GOYA';
核心逻辑是跳过DE、(DE)这类干扰项,直接匹配目标关键词。
内容的提问来源于stack exchange,提问作者Dummy
相关产品推荐
相关产品推荐

