2015-03-31 67 views
0

我有一個查詢那接合兩個表,使用GROUP_CONCAT獲得,然後被映射到一個陣列中的對象的逗號分隔的列表MYSQL加入用空值返回

SQL:

$sql = "SELECT *, 
      GROUP_CONCAT(climb_attributes.attribute_id) as climb_attributes 
      FROM climbs 
      LEFT JOIN climb_attributes ON 
      (climbs.id = climb_attributes.climb_id) 
      GROUP BY climb_id 
      ORDER BY climbs.id"; 

PHP

$all_climb_profiles[$climb->id]->attributes = explode(",", $climb->climb_attributes); 

幾乎可以正常使用,但我目前只獲得BAC k結果如果climb_attributes表包含攀登ID。基本上爬坡仍然可以存在,即使它沒有任何屬性,但目前它必須有一個屬性要在結果中返回。

我還需要將它加入到另一個表中以獲取屬性ID的屬性名稱...如果您可以幫助解決這個問題,那將是非常好的,但我希望我能弄清楚。

回答

1

首先,當使用group by時,不應該使用*從所有表中進行選擇。您可以放心地從climb表中獲取所有列。

問題是,您正在聚合第二個表中的一列,而不是第一個。如果沒有匹配,則爲NULL。因此,一個更好的查詢是:

SELECT c.*, GROUP_CONCAT(ca.attribute_id) as climb_attributes 
FROM climbs c LEFT JOIN 
    climb_attributes ca 
    ON c.id = ca.climb_id 
GROUP BY c.id 
ORDER BY c.id; 

編輯:

如果要列出字符串,那麼這樣的事情應該工作:

SELECT c.*, GROUP_CONCAT(a.name) as climb_attributes 
FROM climbs c LEFT JOIN 
    climb_attributes ca 
    ON c.id = ca.climb_id LEFT JOIN 
    attributes a 
    ON ca.attribute_id = c.id 
GROUP BY c.id 
ORDER BY c.id 
+0

完美,謝謝你,併爲解釋以及。你能幫我把ca.attribute_id鏈接到第三個包含attribute_id名稱的表,它只是有id和attribute_name列 – 2015-03-31 16:42:29

+0

我一直在試圖找出如何將ca.attribute_id變成實際的值attribute_id存儲在第三個只包含id和屬性列的表中,而不僅僅是一個數字列表,我得到了與數字相關的實際值。 – 2015-04-01 12:16:36