MySQL:GROUP_CONCAT 中的 DISTINCT 删除相同的值(不重复)

Posted

技术标签:

【中文标题】MySQL:GROUP_CONCAT 中的 DISTINCT 删除相同的值(不重复)【英文标题】:MySQL: DISTINCT in GROUP_CONCAT remove same values (not duplicates) 【发布时间】:2015-03-22 18:57:18 【问题描述】:

我有两个表:itemsitem_paramsItems 表是通常的项目列表,item_params 是有多个参数名称及其值的表。

+-----------------------------------------+
| id | item_id | param_name | param_value |
+-----------------------------------------+
|  1 |       1 | Width      | 80 cm       |
|  2 |       1 | Length     | 80 cm       |
|  3 |       1 | Height     | 110 cm      |
+-----------------------------------------+

我需要一个请求,所以我的查询如下所示:

SELECT i.*,
    GROUP_CONCAT(DISTINCT ip.param_name SEPARATOR '|') AS param_names,
    GROUP_CONCAT(DISTINCT ip.param_value SEPARATOR '|') AS param_values
FROM items i
LEFT JOIN item_params ip ON ip.item_id = i.item_id
WHERE i.item_id = 1
LIMIT 1

为避免重复值,我使用 DISTINCT,但如果 param_value 对不同的 param_name 具有相同的值,则它仅返回 80 cm|110 cm.

我怎样才能获得唯一的 param_name 及其所有 param_value 而不管相同的值?

【问题讨论】:

这是LEFT JOIN ... ON ...,而不是WHERE @axiac 我知道,我的错。这只是示例... 【参考方案1】:

查询的SELECT 子句中的表达式是独立的,每个表达式仅使用表达式中涉及的数据计算。

您可能需要将参数名称与其对应的参数值粘合,然后将它们传递给GROUP_CONCATDISTINCT

类似这样的:

SELECT i.*,
   GROUP_CONCAT(DISTINCT CONCAT(param_name, ':', param_value) SEPARATOR '|') AS params,
FROM items i
LEFT JOIN item_params ip ON ip.item_id = i.item_id
WHERE i.item_id = 1
GROUP BY i.item_id

此查询应生成Width:80 cm|Length: 80 cm|Height: 110 cm,您可以拆分此字符串并恢复客户端代码中的参数名称和值。

【讨论】:

以上是关于MySQL:GROUP_CONCAT 中的 DISTINCT 删除相同的值(不重复)的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 中的group_concat函数的使用及陷阱

MySql 存储过程.... group_concat 中的错误

mysql中的 group_concat

mysql 对 group_concat 中的项目进行计数

MySQL 中的 GROUP_CONCAT - 如何包含不同的值?

MySQL中的group_concat函数