2015-03-31 68 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