如何跨表执行简单的单语句SQL搜索?

时间:2008-09-11 11:43:12

标签: sql search

假设存在两个表:usersgroups

如何提供用户输入文字的“简单搜索”,结果包含名称中包含文字的用户和群组?

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

4 个答案:

答案 0 :(得分:3)

诀窍是将UNION与文字字符串组合以确定返回的“对象”的类型。在大多数(?)情况下,UNION ALL将更有效,并且应该使用,除非在子查询中需要重复。以下模式应该足够了:

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

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

答案 1 :(得分:1)

如果您使用“UNION ALL”,那么db不会尝试删除重复项 - 无论如何您都不会在两个查询之间重复(因为第一列不同),因此UNION ALL将更快。
(我假设您在要删除的每个查询中没有重复项)

答案 2 :(得分:1)

使用LIKE会导致许多问题,因为当LIKE比较器以%开头时,每次都需要进行表扫描。这会强制SQL检查每一行,并通过您用于比较的字符串逐字节地工作。虽然这可能会在您启动时很好,但很快就会导致缩放问题。

处理此问题的更好方法是使用全文搜索。虽然这将是一个更复杂的选项,但它将为非常大的数据库提供更好的结果。然后你可以使用一个功能版本的例子Bobby Jack将你的两个结果集UNION ALL放在一起并显示结果。

答案 3 :(得分:1)

我建议另外添加

 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转换为大写,或者在查询中执行此操作。这样您就可以获得不区分大小写的搜索。