我有几张 table :
products: id (int), name (varchar)
colors: id (int), name (varchar)
sizes: id (int), name (varchar)
products_colors: color_id (int), product_id (int)
products_sizes: size_id (int), product_id (int)
我只想生成一个返回所有信息的查询(而不是 3 个查询,1 个用于产品,1 个用于颜色,1 个用于尺寸) 我发现我可以使用 GROUP_CONCAT 做一些“体面”的事情,但查询返回重复的数据,不确定是否发生这种情况,因为 GROUP_CONCAT 或 JOINS
SELECT products.id, products.name, CONCAT("[", GROUP_CONCAT("'", colors.name, "'"), "]") colors, CONCAT("[", GROUP_CONCAT("'", sizes.name, "'"), "]") sizes
FROM products
LEFT JOIN products_sizes ON products_sizes.product_id = products.id
LEFT JOIN sizes ON sizes.id = products_sizes.size_id
LEFT JOIN products_colors ON products_colors.product_id = products.id
LEFT JOIN colors ON colors.id = products_colors.color_id
GROUP BY products.id
请注意,我正在使用 CONCAT 将分组数据格式化为 JSON 如果 products_colors 和 products_sizes 中存在匹配,则数据将在 GROUP_CONCAT 中重复
无论是否有颜色或尺寸,我都需要退回所有产品
最佳答案
尝试将distinct添加到group_concat函数中:
SELECT products.id,
products.name,
case when colors.name is null then '[]' else
CONCAT("[", GROUP_CONCAT(distinct "'", colors.name, "'"), "]") end as colors,
case when sizes.name is null then '[]' else
CONCAT("[", GROUP_CONCAT(distinct "'", sizes.name, "'"), "]") end as sizes
FROM products
LEFT JOIN products_sizes
ON products_sizes.product_id = products.id
LEFT JOIN sizes
ON sizes.id = products_sizes.size_id
LEFT JOIN products_colors
ON products_colors.product_id = products.id
LEFT JOIN colors
ON colors.id = products_colors.color_id
GROUP BY products.id, products.name
关于mysql - 在具有多个连接的同一查询中对数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25955188/