假定这两个表中的存在: usersgroups.

怎么个提供"简单搜索",在其中一个用户进入的文字和结果中包含有用户和群体,其名称中包含的文本?

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

有帮助吗?

解决方案

关键是要把一个 UNION 用文字串的类型确定的"对象"返回。在大多数(?) 情况中,联盟的所有会更有效,并应被使用,除非重复都需要在子查询。下列模式应该足够了:

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

注意到:我已经加入的回答我自己,因为我遇到了这个问题,昨天,没能找到一个很好的解决方案,并用此方法。如果有人有一个更好的办法,请随时加入它。

其他提示

如果使用"联盟所有"然后数据库并不试图删除重复的-你不会有重复之间的两个询问无论如何(因为第一列是不同的),使联盟所有会更快。
(我认为你不必重复的内部每个查询,你想要删除)

使用会引起一些问题,因为它将需要一台扫描每一次当像比较开始%。这种部队SQL检查每一个单列和它的工作的方式,逐字节,通过字符串中使用进行比较。虽然这可能是现时开始,它迅速导致扩展的问题。

一个更好的方式来处理这个是使用全文检索。虽然这将是一个更复杂的选择,它将为你提供更好的结果非常大的数据库。然后你就可以使用一个正常运作的版本,例如鲍比的杰克给了你 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以上情况的第一或做就做到这一点,在查询。这样你会得到一个情况不敏感的搜索。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top