我试图在我的数据库中的字段中搜索相同的文本以查找livesearch框。使用Postgres在多个字段中搜索一个词条
SELECT DISTINCT u.id, u.username FROM
users AS u, user_invoice AS ui, user_roles AS ur, roles AS r WHERE
u.id = ur.user_id AND
ur.role_id = r.id AND
r.name = 'teacher' AND
(
ui.user_id = u.id AND
CAST(ui.invoice AS TEXT) = 'searchterm'
)
此查询将搜索发票表并正确且快速地返回结果。
SELECT DISTINCT u.id, u.username FROM
users AS u, user_invoice AS ui, user_roles AS ur, roles AS r WHERE
u.id = ur.user_id AND
ur.role_id = r.id AND
r.name = 'teacher' AND
(u.username like '%searchterm%')
此查询会搜索匹配的用户名,并且返回速度也非常快。
但是,当我将二者结合起来是这样的:
SELECT DISTINCT u.id, u.username FROM
users AS u, user_invoice AS ui, user_roles AS ur, roles AS r WHERE
u.id = ur.user_id AND
ur.role_id = r.id AND
r.name = 'teacher' AND
(
u.username like '%searchterm%' OR
(
ui.user_id = u.id AND
CAST(ui.invoice AS TEXT) = 'searchterm'
)
)
它返回正确的结果,但需要差不多一分钟这样做。我究竟做错了什么?
编辑:我查询的解释:
第一: http://explain.depesz.com/s/PvS
二: http://explain.depesz.com/s/D5c
组合: http://explain.depesz.com/s/Dhf
编辑的错误在复制投行。
PostgreSQL版本?请同时显示'解析分析'输出;粘贴到explain.depesz.com并链接到这里。 –
如果您将查询重写为JOIN语法,您可能会发现自己。 – wildplasser
我必须同意wildplasser--使用'FROM INNER JOIN ON(condition)'而不是'FROM a,b WHERE(condition)'来理解发生了什么很容易。另外,三人中的第二个如何产生明智的结果?你有一个来自不受限制的加入'ui'的笛卡尔产品。 –