Reputation: 1624
I have three table product
ID name
1 A
2 B
3 C
vendor
ID Name
1 V1
2 V2
3 V3
product_vendor
ID pid vid
1 1 1
2 1 2
3 2 3
4 3 1
5 3 2
6 3 3
i want left join and create response like below table
p_id product vendors
1 A V1,V2
2 B V3
3 C V1,V2,V3
below is the my solution but it's quite complicated. Is it possible to have a short query for this
SELECT GROUP_CONCAT(v2.`name`) AS vendername,
p.*,
GROUP_CONCAT(v.`v_id`) AS vi
FROM `products` p
JOIN `product_vendor` v ON p.id = v.p_id,
`vendors` v2
WHERE v2.id IN
(SELECT GROUP_CONCAT(p.`id`) AS vi
FROM `vendors` p
JOIN `product_vendor` v ON p.id = v.p_id
GROUP BY p.id)
GROUP BY p.id
ORDER BY `p_id` ASC
Upvotes: 1
Views: 69
Reputation: 3997
Can you try this, I do not have executed the query but thinks it will help:
SELECT `P`.`id`, `P`.`name`, CONCAT(GROUP_CONCAT(CAST(`V`.`name` AS CHAR)), ", ") as vendername
FROM `product` P
JOIN `product_vendor` PV ON (`PV`.`pid` = `P`.`id`)
JOIN `vendor` V ON (`V`.`ID` = `PV`.`vid`)
GROUP BY `PV`.`pid`
For listing all records in Product table use:
SELECT `P`.`id`, `P`.`name`, CONCAT(GROUP_CONCAT(CAST(`V`.`name` AS CHAR)), ", ") as vendername
FROM `product` P
LEFT JOIN `product_vendor` PV ON (`PV`.`pid` = `P`.`id`)
LEFT JOIN `vendor` V ON (`V`.`ID` = `PV`.`vid`)
GROUP BY `PV`.`pid`
ORDER BY `P`.`id`
Upvotes: 1
Reputation: 64476
Just do it with joins and group_concat
no need for sub queries
SELECT
p.id,
p.name,
Group_concat(v.name) AS vendername
FROM
product p
JOIN
product_vendor pv ON p.id = pv.pid
JOIN
vendor v ON pv.vid = v.id
GROUP BY
p.id, p.name
ORDER BY
p.id ASC
Upvotes: 1