如何在MySQL中为每行仅连接唯一列?

问题描述 投票:0回答:2

如何为MySQL中为每一行指定的列仅连接唯一列?

表'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_ACol_BCol_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。什么是获得预期结果的最有效方法?

mysql set mariadb distinct concat
2个回答
0
投票

我可以想到几种方法。

一种方法是使用表达式代替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

0
投票

使用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
© www.soinside.com 2019 - 2024. All rights reserved.