2014-11-05 100 views
0

我想顯示所有沒有隱藏可見性規則的產品:true。我不能完全弄清楚SQL。我有以下4個表:左外部sql連接問題

products: 
id: integer 
name: string 

role: 
id: integer 
name: string 

user_roles: 
user_id: integer 
role_id: integer 

visibility_rules: 
hidden: boolean 
product: integer 
role: text 

我嘗試以下

SELECT spree_products.* 
FROM spree_products 
LEFT OUTER JOIN spree_visibility_rules ON spree_visibility_rules.product_id 
             = spree_products.id 
    AND spree_visibility_rules.role_name IN ('Student','Admin') 
    WHERE spree_products.deleted_at IS NULL 
    AND (spree_visibility_rules.visible IS NULL) 

如果我有多個角色(學生&管理等),然後我想找到那些可見的至少一個所有產品的用戶角色。上述sql的問題在於,如果產品對所有用戶角色都可見,它似乎只能工作。如果它隱藏在學生角色中,那麼即使其對於管理員角色可見,也不會返回該產品。我想我誤解了左外連接。

+0

您應該提供實際的表格定義,以便披露fk引用等。「CREATE TABLE」腳本或您在psql中使用'\ d tbl'獲得的內容。 – 2014-11-05 17:04:08

+0

您是否想要一個給定的'user_id'的可見產品列表?或所有'users_id'的所有可見產品或每個'user_id'具有可見產品的列表? – 2014-11-05 17:10:13

回答

0

user_id可見產品:

SELECT p.* 
FROM user_roles  ur 
JOIN role    r ON r.id = ur.role_id 
JOIN visibility_rules vr ON vr.role = r.id 
JOIN spree_products p ON p.id = vr.product 
WHERE ur.user_id = 123 -- given user_id 
AND NOT vr.hidden 
GROUP BY p.id;   -- must be defined as PK 

取決於細節,表現可能會進一步優化。

0

你需要一個子選擇。

SELECT 
    * 
FROM 
    spree_products 
WHERE 
    id IN (
    SELECT 
     product_id 
    FROM 
     spree_visibility_rules 
    WHERE 
     NOT hidden 
); 
0
select sp.id,sp.name,svr.hidden from spree_products sp 
inner join spree_visibility_rules svr 
on sp.id = svr.product 
where svr.hidden = 0