简体   繁体   中英

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:

在此处输入图片说明

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....

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 ;

If what you are trying to do is removing the NULL fields, you just have to add a WHERE condition excluding the NULL fields

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 
WHERE m.manufacturer IS NOT NULL
-- GROUP BY i.stocknumber
ORDER BY i.stocknumber

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM