mysql - 在具有多个连接的同一查询中对数据进行分组

标签 mysql sql concatenation group-concat

我有几张 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/

相关文章:

mysql - 如果表中不存在列值,则将行插入表中

SQL 连接填充 tempDB

php - 带过滤器的寻呼机 - 两个查询

MySQL:组合表1中的多个列并插入表2中的1列

mysql - 如何实现更高效的搜索功能?

mysql - 如何在 MySQL 中将 2 个字符串转换为日期

java - 连接字符串中的绝对文件路径

php - 数组到字符串错误

mysql - 复杂的 MySQL 排序

mysql - 统计某个类别内的所有活跃产品;左连接未按预期工作