2011-11-25 152 views
0

我在爲一個項目獲取多個屬性時遇到問題。下面是我的表:來自一個查詢的多個屬性

表:product_attrib

id | product_id | name | value 
------------------------------ 
0 |   33 | age | 25 
1 |   33 | size | 25 

我的問題是,當我加入了查詢,我只得到一個屬性有這樣一個查詢:

查詢:

SELECT 
    p.* 
    ,pa.name 
    ,pa.value 
FROM product AS p 
LEFT OUTER JOIN product_attrib AS pa ON (
    p.id = pa.product_id 
) 

我的結果

"products_id":"0", 
"products_price":"0.0000", 
"products_name":null, 
"products_description":null, 
"attrib_name":"color", 
"attrib_value":"red" 

您是否看到我如何獲得一個屬性集? 有沒有一種方法我可以得到全部產品的屬性?

+1

這是令人困惑的問題。請重寫你的問題。 –

回答

1

很可能,您的原始查詢是正確的。無論是否可以找到屬性,您可能都需要該產品。

可以扭轉在JOIN表的順序,以防止丟失行從product_attrib像這樣(如果productproduct_id 33不存在):

SELECT 
    p.* 
    ,pa.name 
    ,pa.value 
FROM product_attrib AS pa 
LEFT JOIN product AS p ON p.id = pa.product_id 

但是這可能不是你想要的。

LEFT [OUTER] JOIN包括從所述左手錶中的所有行和從右側表所在的JOIN條件可以被滿足(潛在地產生多個行,如果多個匹配在右手錶中找到)。如果沒有匹配的增加值行可以在右手錶中找到NULL值被替換爲右手錶的所有列。
reading the manual here開始。

如果要在同一行中的每個產品的「所有屬性」,則需要aggregate values。這樣的事情:

SELECT p.* 
     ,group_concat(pa.name) AS att_names 
     ,group_concat(pa.value) AS att_values 
FROM product AS p 
LEFT JOIN product_attrib AS pa ON p.id = pa.product_id 
WHERE p.product_id = 33 
GROUP BY p.*; 
+0

啊,總結是我失蹤!非常感謝你,我很欣賞你給我回答這個問題的時間:) – JREAM

-2

我看到很多人寫完整的聯接,當他們沒有必要。如果我錯了,請糾正我。

SELECT 
    p.* 
    ,pa.name 
    ,pa.value 
FROM product AS p, product_attrib AS pa 
WHERE p.id = pa.product_id 
+0

你錯了兩種方式:1)這不是一個LEFT JOIN。 2)在任何情況下,明確的JOIN語法都是正確的方法。 –

+0

爲什麼需要左連接?是否有文檔說明JOIN更合適?這可以用更少的代碼完成同樣的事情(儘管如果產品沒有屬性,它將不會返回任何內容)。 – Julien

+1

這與「INNER JOIN」完全相同,與「LEFT JOIN」不同。如果我們想要顯示沒有屬性的產品,則需要'LEFT JOIN'。較少的代碼,不。我計算了相同數量的代碼。文檔是已有19年曆史的SQL-92標準。 –