我試圖在我的數據庫中的字段中搜索相同的文本以查找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'的笛卡爾產品。 –