mysql - 如何获取具有相同列值的项目
问题描述
我有桌子
Products(color_keyword,color)
我的目标是:
当我在做`
SELECT *
FROM Products
使用相同的color_keyword将颜色添加到每个产品列表中(甚至可以用逗号分隔)。
使用数据库工具有可能吗?
如果没有,也许可以重新组织数据库/表以实现此结果。
我知道我可以通过 foreaching 在 node.js 中返回的每个产品并使用 为每个产品选择请求进行处理 WHERE color_keyword=current_product_color_keyword
,但我正在寻找更优雅的解决方案。
谢谢。
解决方案
我们可以使用相关子查询,但要小心大集合。相关子查询将为外部查询返回的每一行执行,因此我们要确保合适的索引可用。在性能方面,这种方法有可能吃掉我们的午餐和午餐盒。
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 ...
推荐阅读
- java - Spring @ComponentScan 未检测到 REST 控制器
- c# - System.Net.Mail 在生产服务器上不起作用
- java - MongoDB 附近查询无法检索位置
- javascript - 如何按ID从数组中过滤json对象并传递给recyclerview
- android-studio - 如何在 Android Studio for Kotlin 中为方法添加灰色的参数提示(msg、上下文)?
- bash - $(printf '%q ' "${@:1}") 是否等同于 "${*}"?
- javascript - 从 JS 时间戳转换为带有时区的 Postgresql 时间戳
- json - 如何从 CouchDB 文档中的视图中获取特定数据
- c# - 不添加新字段/方法的继承有意义吗?
- java - 我如何处理以下代码示例中的异常。?