为啥 group_concat 会为每一行带来所有产品 ID

Posted

技术标签:

【中文标题】为啥 group_concat 会为每一行带来所有产品 ID【英文标题】:Why does the group_concat bring all the product ids for every row为什么 group_concat 会为每一行带来所有产品 ID 【发布时间】:2011-09-23 18:16:30 【问题描述】:

这是我的查询,它有几个连接,除了 GROUP_CONCAT(p.product_id) 和 SUM(p.price) 部分外,所有连接都运行良好。

SELECT ts.name as main_name, tp.class_id, ts.step_number, GROUP_CONCAT(p.product_id) as product_id, SUM(p.price) as price
from template as t 
JOIN template_step as ts on ts.template_id=t.template_id 
JOIN template_product as tp on tp.template_id=ts.template_id 
JOIN product as p on p.product_id=tp.product_id 
JOIN product_description as pd on pd.product_id=p.product_id 
where t.template_id = '59' 
group by tp.class_id, ts.step_number 
ORDER by ts.step_number, tp.class_id

问题是返回product_ids的元素和sum字段重复

这是我的查询数据

Networking  1   1    88,156,151,275,48,101,274,133,154,125,135,148,63,63    3070.0000
Networking  2   1    275,235,164,274,154,124,169,148,62,98,62,277,191,270   3695.0000
Networking  3   1    92,98,216,181,133,187,272,154,274,148,126,62,62,165    4970.0000
Back Office 1   2    63,88,156,151,275,48,101,274,133,154,125,135,148,63    3070.0000
Back Office 2   2    275,235,164,274,154,124,169,148,62,98,62,277,191,270   3695.0000
Back Office 3   2    62,165,92,98,216,181,133,187,272,154,274,148,126,62    4970.0000
Data Back   1   3    148,63,63,88,156,151,275,48,101,274,133,154,125,135    3070.0000
Data Back   2   3    270,275,235,164,274,154,124,169,148,62,98,62,277,191   3695.0000
Data Back   3   3    62,62,165,92,98,216,181,133,187,272,154,274,148,126    4970.0000
Kitchen     1   4    135,148,63,63,88,156,151,275,48,101,274,133,154,125    3070.0000

每个类应该只返回 1 或 2 个 product_id。如果我可以提供任何其他信息来帮助其他人帮助我,我可以提供任何东西..db 结构..ext..

【问题讨论】:

连接的表之间是什么关系? 【参考方案1】:

GROUP_CONCAT() 不会删除重复的行,除非您使用 DISTINCT

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY unsigned_integer | col_name | expr
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

【讨论】:

不仅是 dups,而且如果您看到 tp.class_id 对 product_id 重复并且总和相同...这是错误的 如果没有GROUP_CONCAT() 部分,您的结果是否正确?您的 GROUP BY 子句省略了您在 SELECT 子句中检索到的许多列。 好的解决了这个问题,问题出在我的join子句中我需要两个条件JOIN template_product as tp on (tp.template_id=ts.template_id and ts.step_number=tp.step_number)

以上是关于为啥 group_concat 会为每一行带来所有产品 ID的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我单击一个链接时,它会为我的所有链接执行该功能? (Javascipt)

ROWID伪列

想用 Puppeteer 刮桌子。如何获取所有行,遍历行,然后为每一行获取“td”?

MYSQL 为每一行从另一个表连接随机行

如何在 Oracle Apex 5 中为每一行唯一地更新列?

为啥 HAVING 和 GROUP_CONCAT 在此查询中不能一起工作?