【问题标题】:SQL users searching querySQL 用户搜索查询
【发布时间】:2026-01-15 14:55:02
【问题描述】:

我想创建查询来搜索表users 中的给定信息。表格包括:idusernamefirstnamelastnamephoneemail

示例搜索文本: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的电话
  • 所以示例文本的每个部分都必须匹配不同的字段,但他们没有指定哪个部分必须匹配哪个字段,并且您希望所有字段都匹配?
  • 你能举一个不应该返回的记录的例子吗?我还是不确定我明白了。

标签: mysql sql search


【解决方案1】:

我认为应该这样做:

SELECT * FROM  `users` WHERE (
       (firstname LIKE '%mat%' OR lastname LIKE '%mat%' OR
        phone LIKE '%mat%' OR email LIKE '%mat%' OR username LIKE '%mat%')
       AND
       (firstname LIKE '%h%' OR lastname LIKE '%h%' OR
        phone LIKE '%h%' OR email LIKE '%h%' OR username LIKE '%h%')
       AND
       (firstname LIKE '%50%' OR lastname LIKE '%50%' OR
        phone LIKE '%50%' OR email LIKE '%50%' OR username LIKE '%50%')
       AND
       (firstname LIKE '%@l%' OR lastname LIKE '%@l%' OR
        phone LIKE '%@l%' OR email LIKE '%@l%' OR username LIKE '%@l%')
       AND
       (firstname LIKE '%d%' OR lastname LIKE '%d%' OR
        phone LIKE '%d%' OR email LIKE '%d%' OR username LIKE '%d%')
      )

您需要分别测试每个条件,而不是每个字段。

【讨论】:

  • 它看起来有效。但我会做更多的测试。如果他们通过了,我会接受你的回答:)
  • 看起来一切正常。非常感谢您的帮助:)