Kyle Goslan
Kyle Goslan

Reputation: 10920

MYSQL Join with Null value returned

I have a query thats joining two table, using the GROUP_CONCAT to get a comma separated list which is then being mapped to an array in an object

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

Nearly working perfectly, except I currently only get back results IF the climb_attributes table contains the climb id. Essentially a climb can still exist even if it doesn't have any attributes, but at the moment it has to have an attribute to be returned in the results.

I also need to join it to another table to get the attribute name for the attribute id...if you can help with that as well that would be great, I'm hoping I can figure that out though.

Upvotes: 0

Views: 37

Answers (1)

Gordon Linoff
Gordon Linoff

Reputation: 1269603

First, you should not be using * to select from all tables when using group by. You can safely take all the columns from the climb table.

The problem is that you are aggregating on a column in the second table, rather than the first. And, it is NULL if there is no match. So, a better query is:

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;

EDIT:

If you want to list the strings, then something like this should work:

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

Upvotes: 1

Related Questions