首页 > 解决方案 > 如何获取具有相同列值的项目

问题描述

我有桌子

Products(color_keyword,color)

我的目标是:

当我在做`

SELECT * 
  FROM Products

使用相同的color_keyword将颜色添加到每个产品列表中(甚至可以用逗号分隔)。

使用数据库工具有可能吗?

如果没有,也许可以重新组织数据库/表以实现此结果。

我知道我可以通过 foreaching 在 node.js 中返回的每个产品并使用 为每个产品选择请求进行处理 WHERE color_keyword=current_product_color_keyword,但我正在寻找更优雅的解决方案。

谢谢。

标签: mysqldatabase

解决方案


我们可以使用相关子查询,但要小心大集合。相关子查询将为外部查询返回的每一行执行,因此我们要确保合适的索引可用。在性能方面,这种方法有可能吃掉我们的午餐和午餐盒。

 SELECT p.id
      , p.color_keyword
      , p.color
      , ( SELECT GROUP_CONCAT(DISTINCT q.color ORDER BY q.color)
            FROM products q
           WHERE q.color_keyword <=> p.color_keyword
        ) AS color_list 
   FROM products p 
 WHERE ...   

另一种方法是使用连接到内联视图

 SELECT p.id
      , p.color_keyword
      , p.color
      , q.color_list
   FROM products p 
   LEFT
   JOIN ( SELECT r.color_keyword 
               , GROUP_CONCAT(DISTINCT r.color ORDER BY r.color) AS color_list
           FROM products r
          GROUP BY r.color_keyword
        ) q
     ON q.color_keyword <=> p.color_keyword  
 WHERE ...   

推荐阅读