【发布时间】:2026-01-15 14:55:02
【问题描述】:
我想创建查询来搜索表users 中的给定信息。表格包括:id、username、firstname、lastname、phone 和 email。
示例搜索文本:mat h 50 @l d
应该返回的唯一记录:1 | admin | mat | hladeo | 123450789 | admin@localhost
我的查询:
SELECT * FROM `users` WHERE (
(`firstname` LIKE '%mat%') || (`firstname` LIKE '%h%') ||
(`firstname` LIKE '%50%') || (`firstname` LIKE '%@l%') ||
(`firstname` LIKE '%d%')
) && (
(`lastname` LIKE '%mat%') || (`lastname` LIKE '%h%') ||
(`lastname` LIKE '%50%') || (`lastname` LIKE '%@l%') ||
(`lastname` LIKE '%d%')
) && (
(`phone` LIKE '%mat%') || (`phone` LIKE '%h%' ) ||
(`phone` LIKE '%50%') || (`phone` LIKE '%@l%') ||
(`phone` LIKE '%d%')
) && (
(`email` LIKE '%mat%') || (`email` LIKE '%h%') ||
(`email` LIKE '%50%' ) || (`email` LIKE '%@l%') ||
(`email` LIKE '%d%')
) && (
(`username` LIKE '%mat%') || (`username` LIKE '%h%') ||
(`username` LIKE '%50%') || (`username` LIKE '%@l%') ||
(`username` LIKE '%d%')
)
但是这个查询返回的人的用户名包含d,他们的电话号码包含50。
编辑:
此查询返回 3 行:
1 | admin | mat | hladeo | 123450789 | admin@localhost
8 | dillese | Adriana | Zolch | 44450232 | dilesse@msn.com
12 | dcolhut | Denise | Colhut | 502222222 | dcolhut@msn.com
并且应该只返回第一行(因为符合所有要求)。
===========
还有主要问题——如何优化这个查询?有没有可能让它变得更简单?
问候
【问题讨论】:
-
你可以使用正则表达式代替
LIKE模式:fieldname RLIKE 'mat|h|50|@l|d'仍然效率低下,因为这个正则表达式必须扫描所有记录,它不能使用索引。 -
为什么不返回用户名包含
d和电话包含50的人?匹配逻辑应该是什么? -
我不知道如何在 SQL 中正确指定它,但是“这个查询”应该只返回完全匹配的记录,所有信息都在其中找到 - 不仅仅是它的某些部分,比如包含 @987654338 的用户名@和包含
50的电话 -
所以示例文本的每个部分都必须匹配不同的字段,但他们没有指定哪个部分必须匹配哪个字段,并且您希望所有字段都匹配?
-
你能举一个不应该返回的记录的例子吗?我还是不确定我明白了。