2011-02-08 86 views
2

我有一個屬性數據庫。每個屬性值都存儲在一個ID爲其父屬性的表中。MySQL屬性數據庫

在一個獨立的表我會寫這將拉動數據

WHERE username = '' AND domain = '' 

在屬性表中每個值存儲爲一個單獨的行SQL語句,我不能這樣做。我有一個加入,讓我帶回一個值+結果(見下文),但我需要如上圖所示基於2個條件的結果..

SELECT upa.value, up.status, u.status 
    FROM user_product up, product_attribute pa, product p, user u, user_product_attribute upa 

WHERE pa.attribute_name = 'username' 
    AND pa.product_attribute_id = upa.product_attribute_id 
    AND pa.product_id = p.product_id 
    AND u.user_id = up.user_id 
    AND up.user_product_id = upa.user_product_id 

    AND p.product_name = 'email' 
    AND upa.value  = 'exampleuser' 

我相信我會需要重新加入以上能夠在某些工會的種類?任何輸入將有幫助..

謝謝

回答

1

請不要使用隱式連接語法。第二組連接需要獲得第二個屬性。

SELECT upa1.value, upa2.value, up1.status, u1.status 
    FROM product p 
    /* These joins get attribute/value for 'username' attribute */ 
    INNER JOIN product_attribute pa1 
     ON p.product_id = pa1.product_id 
     AND pa1.attribute_name = 'username' 
    INNER JOIN user_product_attribute upa1 
     ON pa1.product_attribute_id = upa1.product_attribute_id 
    INNER JOIN user_product up1 
     ON upa1.user_product_id = up1.user_product_id 
    INNER JOIN user u1 
     ON up1.user_id = u1.user_id 
    /* These joins get attribute/value for 'domain' attribute */ 
    INNER JOIN user_product_attribute upa2 
     ON upa1.user_product_id = upa2.user_product_id 
    INNER JOIN product_attribute pa2 
     ON upa2.product_attribute_id = pa2.product_attribute_id    
     AND pa2.attribute_name = 'domain' 
    WHERE p.product_name = 'email' 
+0

嗨,感謝您的輸入..然而,我看到的問題是可能有很多域,不只是一個..所以做這樣的聯接會帶回1:*而不是1:1 .. – Lee 2011-02-08 15:01:48

+0

如果給定產品有很多域名,您如何決定要返回哪個域名?換句話說,你會用什麼其他標準來打破多個域名之間的聯繫? – 2011-02-08 15:12:50

1

您需要重複所有連接兩次以獲取這兩個屬性。如果你一次需要超過2或3個屬性,這並不特別。

SELECT upa.value, up.status, u.status 
FROM user_product up 
JOIN user u ON u.user_id = up.user_id 

-- Join to get attribute 'username' 
JOIN user_product_attribute upa1 ON up.user_product_id = upa1.user_product_id 
JOIN product_attribute pa1 ON pa1.product_attribute_id = upa1.product_attribute_id 
JOIN product p1     ON pa1.product_id = p1.product_id 

-- Join to get attribute 'domain'  
JOIN user_product_attribute upa2 ON up.user_product_id = upa2.user_product_id 
JOIN product_attribute pa2 ON pa2.product_attribute_id = upa2.product_attribute_id 
JOIN product p2     ON pa2.product_id = p2.product_id 

WHERE pa1.attribute_name = 'domain' 
    AND p1.product_name = 'email' 
    AND upa1.value  = 'exampledomain.com' 

    AND pa2.attribute_name = 'username' 
    AND p2.product_name = 'email' 
    AND upa2.value  = 'exampleuser' 
;