mySQL GROUP_CONCAT

SQL запрос для объединения разных значений колонки повторяющихся строк по какому либо признаку в одну строку

У нас имеется две таблицы:

Таблица 1: products

products_idproducts_title
1Товар 1
2Товар 2
3Товар 3

Таблица 2: products_images

products_idimage_url
1link1
2link2
1link3
2link4
1link5

Хотим получить такую таблицу:

products_id products_title image_url
1Товар 1link1,link3,link5
2Товар 2link2,link4
3Товар 3NULL

Для начала нам нужно просто объединить таблицы через левый JOIN, и получить такую таблицу

products_id products_title image_url
1Товар 1 link1
1Товар 1 link3
1Товар 1 link5
2Товар 2link2
2Товар 2link4
3Товар 3NULL
SELECT * FROM products p
    LEFT OUTER JOIN products_images pi ON p.products_id=pi.products_id

После чего переходим к следующему запросу, в результате чего получаем желаемую таблицу

SELECT * FROM products p
    LEFT OUTER JOIN
    	(SELECT products_id, GROUP_CONCAT(image) FROM products_images GROUP BY products_id) pi ON p.products_id=pi.products_id
products_id products_title image_url
1 Товар 1 link1,link3,link5
2 Товар 2 link2,link4
3 Товар 3NULL

Разделитель по умолчанию — запятая, его можно поменять, на любую другую стоку, установив параметр GROUP_CONCAT(image SEPARATOR '|')

Конечно, в одном запросе можно использовать несколько JOIN-ов и GROUP_CONCAT-ов, вот пример запроса который я недавно использовал:

SELECT * FROM products p
	LEFT OUTER JOIN products_description pd ON p.products_id=pd.products_id 
    LEFT OUTER JOIN
    	(SELECT products_id, GROUP_CONCAT(image) FROM products_images GROUP BY products_id) pi ON p.products_id=pi.products_id
    LEFT OUTER JOIN 
    	(SELECT t.products_id, GROUP_CONCAT(t.categories_id, '_', t.categories_name SEPARATOR '|') FROM (        
            SELECT ptc.products_id, ptc.categories_id, cd.categories_name FROM products_to_categories ptc LEFT OUTER JOIN categories_description cd ON ptc.categories_id=cd.categories_id        
        ) t GROUP BY products_id) g ON p.products_id=g.products_id

Добавить комментарий