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

时间:2015-01-23 17:00:57

标签: mysql distinct group-concat

我有两个表: 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_value 来获得唯一的 param_name ,无论相同的值如何?

1 个答案:

答案 0 :(得分:1)

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

您可能需要将param名称与相应的param值相关联,然后将其传递给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,您可以拆分此字符串并恢复客户端代码中的参数名称和值。