表'Example':
考虑下表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服务器版本相对应的手册以获取在'DISTINCT Col_A,Col_B,Col_C附近使用的正确语法) 从第2行的示例LIMIT 0,25'开始
我知道您不能在DISTINCT
中像这样使用CONCAT_WS
。什么是获得预期结果的最有效方法?
我可以想到几种方法。
一种方法是使用表达式代替Col_B,该表达式检查以查看Col_B是否匹配Col_A,如果匹配则返回NULL。表达式检查Col_C以查看其是否匹配Col_A或Col_B也是相同的事情。
CONCAT_WS忽略NULL值,所以类似这样:
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
使用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