MySQL+PHP实现按首字母筛选时如何过滤常用词且不误伤有效数据
你的写法问题出在NOT LIKE "%Services%"会直接过滤所有包含Services的记录,连合法的Stroke Services也会被误判排除,核心要实现的逻辑是:只有当筛选字母出现在非通用词的首字母位置时,才返回对应记录。
可行解决方案
方案1:MySQL正则匹配(适合通用词较少的场景,MySQL 5.7+ 都支持)
直接用正则匹配规则,先找所有以目标字母开头的完整单词,再排除这些单词属于通用词的情况,以筛选字母S为例:
SELECT nid, title FROM node_field_data -- 匹配所有以S开头的完整单词(BINARY控制区分大小写,不需要可以去掉) WHERE title REGEXP BINARY '(^| )S[^ ]*( |$)' -- 排除所有匹配到的单词是通用词的情况,通用词可以自行扩展,注意大小写匹配 AND title NOT REGEXP BINARY '(^| )(and|And|AND|services|Services|SERVICES)( |$)';
执行后你给的示例数据只会返回Stroke Services,完全符合需求。
方案2:冗余字段预处理(适合数据量大、通用词多的场景)
如果你的数据量超过10万,或者后续要频繁新增通用词,建议额外加一个预处理字段,提前过滤通用词存储有效首字母,查询性能比正则高一个数量级:
- 新增字段:
ALTER TABLE node_field_data ADD COLUMN valid_first_char CHAR(1) NOT NULL DEFAULT '' COMMENT '过滤通用词后的首字母';
- 插入/更新标题时,用PHP拆分标题单词,跳过通用词后取第一个非通用词的首字母存入该字段
- 筛选时直接查询该字段即可:
SELECT nid, title FROM node_field_data WHERE valid_first_char = 'S';
内容的提问来源于stack exchange,提问作者A.Raza
相关产品推荐
相关产品推荐

