MYSQL加入Null值返回

时间:2015-03-31 16:05:53

标签: php mysql sql

我有一个连接两个表的查询,使用GROUP_CONCAT获取逗号分隔列表,然后将其映射到对象中的数组

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);

几乎完美地工作,除了我目前只返回结果,如果climb_attributes表包含爬升ID。基本上即使它没有任何属性,攀爬仍然可以存在,但目前必须在结果中返回一个属性。

我还需要将它连接到另一个表来获取属性id的属性名称...如果你能帮助那个也很好,我希望我能解决这个问题。

1 个答案:

答案 0 :(得分: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