代码之家  ›  专栏  ›  技术社区  ›  Teej

是否可以同时搜索两个或多个字段?

  •  2
  • Teej  · 技术社区  · 15 年前

    我正在努力创造这样的东西:

    SELECT *
    FROM (`tm_accounts`)
    WHERE  CONCAT(`last_name`, `first_name`)  LIKE '%o%'
    

    当然,这不起作用。我只想让你看到我试图模仿的东西背后的想法。

    姓氏和名字是accounts表中的两个独立字段

    2 回复  |  直到 14 年前
        1
  •  9
  •   Bevan    15 年前
    SELECT *
    FROM (`tm_accounts`)
    WHERE last_name LIKE '%o%' 
       or first_name LIKE '%o%';
    
        2
  •  9
  •   OMG Ponies    15 年前

    我建议使用:

    SELECT a.*
      FROM TM_ACCOUNTS a
     WHERE a.first_name LIKE '%o%'
    UNION
    SELECT b.*
      FROM TM_ACCOUNTS b
     WHERE b.last_name LIKE '%o%'
    

    OR S因性能差而臭名昭著,并且存在维护风险。

    注意我在用 UNION 将从最终结果集中删除重复项。同时 UNION ALL 如果性能更好,它不会删除重复项,因此不适合在这种情况下使用。

    如果您不知道,请将通配符放在 LIKE 条件将不使用索引。所以如果你有一个索引 TM_ACCOUNTS.last_name TM_ACCOUNTS.first_name (如果使用覆盖索引,则两者都可以)。

    这是:

    WHERE CONCAT(`last_name`, `first_name`)  LIKE '%o%'
    

    …不是一个好习惯-更好的方法是在嵌套select/inline视图中执行函数。例如:

    SELECT x.*
      FROM (SELECT t.*,
                   CONCAT(t.last_name, t.first_name) AS full_name
              FROM TM_ACCOUNTS t) x
     WHERE x.full_name LIKE '%o%'