假设存在两个表:users
和groups
。
如何提供用户输入文字的“简单搜索”,结果包含名称中包含文字的用户和群组?
搜索结果必须区分这两种类型。
答案 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转换为大写,或者在查询中执行此操作。这样您就可以获得不区分大小写的搜索。