Search code examples
phpmysqlsubquerygroup-concat

MySQL subquery pulls multiple results


I've got repeating records with different 'manufacturer' fields. I'm trying to GROUP BY i.stocknumber but that only removes a record without collecting the other manufacturer result.

Some records have a NULL manufacturer field, and I've tried using GROUP_CONCAT in the subquery to elide the differing results for "manufacturer".

Here's my current query:

SELECT i.id,i.stocknumber,m.manufacturer
FROM inventory i
INNER JOIN makes mk on i.make = mk.id 
INNER JOIN models md on i.model = md.id 
INNER JOIN classes cl on i.class = cl.id 
LEFT JOIN ( 
            SELECT idm.id, idm.inventory_id, dm.manufacturer AS 'manufacturer' 
            FROM display_manufacturers dm 
            INNER JOIN inventory_display_manufacturers idm ON dm.id = idm.display_manufacturer_id 
           ) m ON i.id = m.inventory_id 
-- GROUP BY i.stocknumber
ORDER BY i.stocknumber

The result I get is:

enter image description here

Any thoughts on grouping the repeated records by concatenating the manufacturer field?

(NOTE: I already tried GROUP_CONCAT on the subquery)

DESIRED RESULT:

id   | stocknumber | manufacturer
----------------------------------
946  | 011A        | NULL
907  | 1001        | Sports Coach, Coachmen
1032 | 1001x       | Sports Coach

etc....


Solution

  • Are you looking for this?

    SELECT i.id, i.stocknumber, group_concat(distinct m.manufacturer) as manufacturers
    . . .
    GROUP BY i.stocknumber
    

    EDIT:

    This version explicitly uses your query as a subquery. It should not put all manufacturers on the same row:

    select stocknumber, group_concat(distinct manufacturer) as manufacturers
    from (SELECT i.id,i.stocknumber,m.manufacturer
          FROM inventory i
          INNER JOIN makes mk on i.make = mk.id 
          INNER JOIN models md on i.model = md.id 
          INNER JOIN classes cl on i.class = cl.id 
          LEFT JOIN ( 
                SELECT idm.id, idm.inventory_id, dm.manufacturer AS 'manufacturer' 
                FROM display_manufacturers dm 
                INNER JOIN inventory_display_manufacturers idm ON dm.id = idm.display_manufacturer_id 
               ) m ON i.id = m.inventory_id
         ) t
    GROUP BY stocknumber ;