Я использовал textsearch-controls для полнотекстового поиска в postgres. И все работает правильно. Я создал индекс и использовал в запросе. Но когда мне понадобилось присоединиться к другой таблице, я столкнулся с ошибкой.
> ERROR: invalid reference to FROM-clause entry for table "p"
LINE 10: ON cp.product_id = p.id
^
HINT: There is an entry for table "p", but it cannot be referenced from this part of the query.
мой запрос
SELECT
p.id AS id,
p.sku As sku,
cp .category_id,
ts_rank_cd(to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')), query) AS rank
FROM products p, to_tsquery('Urbanears:*') query
LEFT JOIN category_product cp
ON cp.product_id = p.id
WHERE to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')) @@ query
ORDER BY rank DESC
без left join
запрос с @@ query
работает корректно, без проблем и без @@ query
запрос с left join
работает правильно. Что я пропустил? Как использовать left join
с to_tsquery
и @@ query
?
при перемещении левого jpin после запроса я столкнулся с другой тихой ошибкой
запрос
SELECT
p.id AS id,
p.sku As sku,
cp .category_id,
ts_rank_cd(to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')), query) AS rank
FROM products p, to_tsquery('Urbanears:*') query
WHERE to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')) @@ query
LEFT JOIN category_product cp
ON cp.product_id = p.id
ORDER BY rank DESC
ошибка:
> ERROR: syntax error at or near "LEFT"
LINE 11: LEFT JOIN category_product cp
^
> Time: 0.001s
ОБНОВЛЕНИЕ :
SELECT
b.category_id, a.id, a.rank
FROM (SELECT
p.id AS id,
ts_rank_cd(to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')), query) AS rank
FROM products p, to_tsquery('Urbanears:*') query
WHERE to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')) @@ query
ORDER BY rank DESC) as a
LEFT JOIN category_product b on b.product_id=a.id
WHERE b.category_id = 181
Я сделал это, когда использовал подзапрос. Фильтр по полнотекстовому поиску по слову и по категории. Но это правильный подход?