Postgresql @@ запрос с ошибкой левого соединения - PullRequest
0 голосов
/ 30 марта 2020

Я использовал 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

Я сделал это, когда использовал подзапрос. Фильтр по полнотекстовому поиску по слову и по категории. Но это правильный подход?

1 Ответ

1 голос
/ 30 марта 2020

Код

FROM X, Y LEFT JOIN Z ON ...

интерпретируется как

FROM X, (Y LEFT JOIN Z ON ...)

Ссылки на X недопустимы внутри ON, поскольку ON применяется только к Y и Z.

Вы не должны смешивать запятые и явные объединения, делайте их оба явными, как это:

FROM products p JOIN to_tsquery('Urbanears:*') query ON 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                                     
...