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

MySQL: DISTINCT in GROUP_CONCAT remove same values (not duplicates)

我有两个 table:itemsitem_paramsItems table 是通常的项目列表,item_params 是 table 其中有几个参数名称和它的价值观。

+-----------------------------------------+
| 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[=31 具有相同的值=] 它 return 只有 80 厘米|110 厘米.

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

查询的 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,您可以拆分此字符串并在客户端代码中恢复参数名称和值。