Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否有一种方法可以同时搜索两个或多个字段?_Sql_Mysql_Database - Fatal编程技术网

Sql 是否有一种方法可以同时搜索两个或多个字段?

Sql 是否有一种方法可以同时搜索两个或多个字段?,sql,mysql,database,Sql,Mysql,Database,我正在考虑创造一些能做到这一点的东西: SELECT * FROM (`tm_accounts`) WHERE CONCAT(`last_name`, `first_name`) LIKE '%o%' 当然,这是行不通的。我只是想让你看看我试图模仿的背后的想法 last_name和first_name是accounts表中两个独立的字段我建议使用: SELECT * FROM (`tm_accounts`) WHERE last_name LIKE '%o%' or first_n

我正在考虑创造一些能做到这一点的东西:

SELECT *
FROM (`tm_accounts`)
WHERE  CONCAT(`last_name`, `first_name`)  LIKE '%o%'
当然,这是行不通的。我只是想让你看看我试图模仿的背后的想法

last_name和first_name是accounts表中两个独立的字段

我建议使用:

SELECT *
FROM (`tm_accounts`)
WHERE last_name LIKE '%o%' 
   or first_name LIKE '%o%';
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%'
因性能差而臭名昭著,并且存在维护风险

请注意,我使用的是
UNION
,它将从最终结果集中删除重复项。虽然
UNION-ALL
的性能会更好,但它不会删除重复项,因此不适合在这种情况下使用

如果您不知道,将通配符放在
LIKE
标准的左侧不会使用索引。因此,如果您对
TM\u账户、姓氏
TM\u账户、姓氏
有索引(如果使用覆盖索引,则两者都有)

这:

…不是一个好习惯-更好的方法是在子选择/内联视图中执行函数。例如:

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%'

令人惊讶的解释。你有我的+1!更好,但还是不好,除非你没有办法。在大多数RDBMS上,函数中的包装列会阻止在如此包装的列上使用任何索引。@Donnie:索引的使用是没有意义的,因为
类似于“%o
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%'