2017-08-02 9 views
0

SQLのエキスパートではありませんが、私はこのクエリを有効にして必要な結果を得ることができました。トリックはそれを実行することです。問題の2つのテーブルは、どちらも6千冊のレコードが入っています。現在は約3分で走っています。私はそれが必要なところです。Postgres複数の結合

SELECT p.id, 
     match.weight 
FROM store_promotions p 
LEFT JOIN 
    (SELECT * 
    FROM 
    (SELECT id, 
      (facets.weight::int * 1.5) AS weight 
     FROM store_promotions promos 
     JOIN -- this will return all promos, but add weight of 1.5 to the ones that are better matched to customer 

     (SELECT (jsonb_array_elements(product) ->> 'key') AS barcode, 
       (jsonb_array_elements(product) ->> 'doc_count') AS weight 
     FROM customer_transaction_facets 
     WHERE account_id = '1234567890') facets ON promos.products @> to_jsonb(facets.barcode::text) 
     UNION SELECT id, 
        (facets.weight::int * .75) AS weight -- this will return all promos, but add weight of .75 for department matches to the ones that are better matched to customer 
     FROM store_promotions promos 
     JOIN 
     (SELECT (jsonb_array_elements(department) ->> 'key') AS department, 
       (jsonb_array_elements(department) ->> 'doc_count') AS weight 
     FROM customer_transaction_facets 
     WHERE account_id = '1234567890') facets ON promos.departments @> to_jsonb(facets.department::text)) matches) AS MATCH ON p.id = match.id WHERE storeid = '637' 

答えて

0
select id, weight 
from 
    store_promotions promos 
    left join (
     select 
      (jsonb_array_elements(product) ->> 'key') as key, 
      (jsonb_array_elements(product) ->> 'doc_count')::int * 1.5 as weight 
     from customer_transaction_facets 
     where account_id = '1234567890' 
     union 
     select 
      (jsonb_array_elements(department) ->> 'key') as key, 
      (jsonb_array_elements(department) ->> 'doc_count')::int * 0.75 as weight 
     from customer_transaction_facets 
     where account_id = '1234567890' 
    ) facets on 
     promos.products @> to_jsonb(facets.key::text) 
     or 
     promos.departments @> to_jsonb(facets.key::text) 
where storeid = '637'