如何在表之间执行简单的单语句SQL搜索?

时间:2020-03-05 18:51:23  来源:igfitidea点击:

假设存在两个表:"用户"和"组"。

如何提供一种"简单搜索",即用户输入文本,结果既包含用户又包含名称包含文本的组?

搜索结果必须区分这两种类型。

解决方案

回答

诀窍是将" UNION"与文字字符串结合起来以确定返回的"对象"的类型。在大多数(?)情况下,UNION ALL会更高效,除非在子查询中需要重复,否则应使用UNION ALL。以下模式就足够了:

SELECT "group" type, name
   FROM groups
  WHERE name LIKE "%$text%"
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE name LIKE "%$text%"

注意:我自己添加了答案,因为昨天我遇到了这个问题,找不到很好的解决方案,并使用了此方法。如果有人有更好的方法,请随时添加。

回答

如果我们使用" UNION ALL",则数据库不会尝试删除重复项,因此无论如何在两个查询之间都不会有重复项(因为第一列不同),因此UNION ALL将更快。
(我假设我们要删除的每个查询中没有重复项)

回答

使用LIKE会引起许多问题,因为当LIKE比较器以%开头时,每次都需要进行表扫描。这将强制SQL检查每一行,并通过用于比较的字符串逐字节地检查其工作方式。当我们开始时这可能很好,但很快会导致缩放问题。

解决此问题的更好方法是使用全文搜索。尽管这将是一个更复杂的选择,但对于大型数据库,它将为我们提供更好的结果。然后,我们可以使用Bobby Hyman给示例" UNION ALL"提供的功能版本,并将两个结果集放在一起,并显示结果。

回答

我建议再增加一个

SELECT "group" type, name
   FROM groups
  WHERE UPPER(name) LIKE UPPER("%$text%")
UNION ALL
 SELECT "user" type, name
   FROM users
  WHERE UPPER(name) LIKE UPPER("%$text%")

我们可以先将$ text转换为大写或者在查询中执行。这样,我们将获得不区分大小写的搜索。