我有一个包含Person Name的SQL表,每一行都有一个值:

  • 约翰·史密斯,约翰·史密斯.
  • 史密斯·约翰.
  • 史密斯·沃伦·约翰
  • 约翰
  • 史密斯

如果我用像"%约翰·史密斯,约翰·史密斯.%"这样的规则搜索"约翰·史密斯,约翰·史密斯.",那些名字为"约翰·史密斯,约翰·史密斯."的会显示出来,但其他行不会显示.我希望"史密斯·约翰."和"史密斯 Warren 约翰"也出现在我的查询中,因为它们都有约翰和史密斯.我如何实现这一点?或者我应该分开,然后把所有可能的组合都组合起来?

=>LIKE"%约翰·史密斯,约翰·史密斯.%"或LIKE"%史密斯·约翰.%"

推荐答案

史密斯·沃伦·约翰

是的,对于您当前的数据 struct ,您应该 拆分并进行所有可能的组合, 例如"SELECT...NAME LIKE‘%John%Smith%’或NAME LIKE‘%Smith%John%’". @fusion3k很有帮助地指出,我们可以将其重构为更简单:

SELECT ... name LIKE '%John%' AND name LIKE '%Smith%'

一定要考虑更改磁盘上的数据 struct . 我假设该表包含"许多"行, 因此,指数化很重要. 请理解前导%通配符 倾向于禁用索引,强制执行扫描行为 取而代之的是. 请注意 EXPLAIN个 查询计划. 通常,一对索引查询将 比单张桌子扫描所需的时间更少.

考虑对'%Smith%'人发出一个查询 然后让您的脚本过滤行 返回,寻找其他字符串匹配.

这可能值得你花时间来写一个 playbook 遍历所有行并更新以填充 具有修改的名称拼写的新列, 例如,在空格上拆分以生成反转的 名字.或者,您甚至可以 Select 存储副本 名称的副本,包括反转的,作为单个字符串. 按字母顺序排列字符串中的单词可以简化查询. 其他规范化,比如名字缩写, 事实可能也会证明这是有帮助的. 存储"额外的"前导空格和尾随空格, 可以更容易地创作一些通配符查询.


MySQL提供 regex support个 通过REGEXP/RLIKE关键字.


考虑使用为以下目的量身定制的磁盘索引 full text search.

Mysql相关问答推荐

如何重新采样SQL数据库

JOOQ-如何在一个查询中引用多个(但不是所有)表中的所有字段

左联接重复问题

用于搜索从各种表中获得的结果的查询

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

在停靠容器中备份和恢复MySQL数据库时出现Unicode字符问题

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

如何确保 SQL 记录的列不引用它自己的主键?

任何值的 SQL WHERE 子句?

如何在 SQL 中计算留存曲线?

谁能帮我优化低性能的mysql查询

如何在不使用子查询的情况下按最小日期计算新用户?

如何创建一个判断行是否存在的mysql查询-如果存在我想插入一条新记录,否则增加一个值

DECIMAL(m, n) 在 64 位系统中如何表示?

如何在 SQL 的计算列中显示小数点后两位?

如何在 Windows 上访问 xampp 的命令行

仅在 MYSQL DATEDIFF 中显示小时数

Sequelize:销毁/删除表中的所有记录

在 MySQL 中签名或未签名

数据截断:第 1 行的logo列数据太长