如何仅连接为MySQL中的每一行指定的列的唯一列?
表“示例”:
考虑下表,名为example
* -------------------------- *
| Id | Col_A | Col_B | Col_C |
| -------------------------- |
| 0 | foo | bar | qux |
| 1 | foo | foo | bar |
| 2 | foo | qux | qux |
| 3 | foo | foo | foo |
* -------------------------- *尝试:
我只想连接Col_A、Col_B和Col_C中唯一的值(只有唯一的集合)。这是我的尝试:
SELECT Id,
CONCAT_WS(',', DISTINCT Col_A, Col_B, Col_C) UniqueColumnSet
FROM Example预期结果:
* -------------------- *
| Id | UniqueColumnSet |
| -------------------- |
| 0 | foo,bar,qux |
| 1 | foo,bar |
| 2 | foo,qux |
| 3 | foo |
* -------------------- *接收到错误:
#1064 -您的SQL语法有一个错误;请检查与您的MariaDB服务器版本相对应的手册,以便在第2行的示例限制0,25中使用接近“DISTINCT Col_A,Col_B,Col_C) UniqueColumnSet”的正确语法。
我知道您不能在DISTINCT中这样使用CONCAT_WS。获得预期结果的最有效方法是什么?
发布于 2020-06-15 17:24:08
有几种方法我能想到。
一种方法是使用表达式代替Col_B,后者检查Col_B是否与Col_A匹配,如果匹配,则返回NULL。对于一个表达式来说,检查Col_C以确定它是否与Col_A或Col_B匹配是一样的。
CONCAT_WS忽略空值,所以如下所示:
SELECT t.id
, CONCAT_WS(','
, t.Col_A
, IF(t.Col_B IN (t.Col_A), NULL, t.Col_B)
, IF(t.Col_C IN (t.Col_A,t.Col_B), NULL, t.Col_C)
) AS UniqueColumnSet
FROM `example` t
ORDER BY t.id例如,示例数据中没有显示重复值不连续的情况。
bar foo bar上面的查询假设我们希望返回
bar,foo发布于 2020-06-15 17:19:53
使用UNION将它们转换为同一列,然后使用GROUP_CONCAT()将它们连接起来。默认情况下,UNION将删除重复项。
SELECT id, GROUP_CONCAT(col) AS UniqueColumnSet
FROM (
SELECT id, col_a AS col
FROM Example
UNION
SELECT id, col_b AS col
FROM Example
UNION
SELECT id, col_c AS col
FROM Example
) AS x
GROUP BY id发布于 2020-06-15 17:56:02
我更喜欢Barmar的解决方案,因为它对我来说是最易读的。但这也应该有效:
select id, concat_ws(',',
Col_A,
NULLIF(Col_B, Col_A), -- NULL if Col_B = Col_A
NULLIF(NULLIF(Col_C, Col_A), Col_B) -- NULL if Col_C = Col_A or Col_C = Col_B
) as UniqueColumnSet
from Example如果结果是使用JSON数组,则可以尝试以下"hack":
select id, json_keys(json_object(Col_A, '', Col_B, '', Col_C, '')) as UniqueColumnSet
from Example;结果:
| id | UniqueColumnSet |
| --- | --------------------- |
| 0 | ["bar", "foo", "qux"] |
| 1 | ["bar", "foo"] |
| 2 | ["foo", "qux"] |
| 3 | ["foo"] |https://stackoverflow.com/questions/62393471
复制相似问题