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 【问题描述】:我有两个表:items 和 item_params。 Items 表是通常的项目列表,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_CONCAT
和DISTINCT
。
类似这样的:
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 中的错误