首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何才能在MySQL中为每个行连接唯一的列?

问如何才能在MySQL中为每个行连接唯一的列?
EN

Stack Overflow用户
提问于 2020-06-15 17:16:10
回答 3查看 46关注 0票数 0

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

表“示例”:

考虑下表,名为example

代码语言:javascript
复制
* -------------------------- *
| 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中唯一的值(只有唯一的集合)。这是我的尝试:

代码语言:javascript
复制
SELECT Id,
       CONCAT_WS(',', DISTINCT Col_A, Col_B, Col_C) UniqueColumnSet
  FROM Example

预期结果:

代码语言:javascript
复制
* -------------------- *
| 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。获得预期结果的最有效方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-06-15 17:24:08

有几种方法我能想到。

一种方法是使用表达式代替Col_B,后者检查Col_B是否与Col_A匹配,如果匹配,则返回NULL。对于一个表达式来说,检查Col_C以确定它是否与Col_A或Col_B匹配是一样的。

CONCAT_WS忽略空值,所以如下所示:

代码语言:javascript
复制
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

例如,示例数据中没有显示重复值不连续的情况。

代码语言:javascript
复制
bar foo bar

上面的查询假设我们希望返回

代码语言:javascript
复制
bar,foo
票数 1
EN

Stack Overflow用户

发布于 2020-06-15 17:19:53

使用UNION将它们转换为同一列,然后使用GROUP_CONCAT()将它们连接起来。默认情况下,UNION将删除重复项。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-06-15 17:56:02

我更喜欢Barmar的解决方案,因为它对我来说是最易读的。但这也应该有效:

代码语言:javascript
复制
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

db-fidle

如果结果是使用JSON数组,则可以尝试以下"hack":

代码语言:javascript
复制
select id, json_keys(json_object(Col_A, '', Col_B, '', Col_C, '')) as UniqueColumnSet
from Example;

结果:

代码语言:javascript
复制
| id  | UniqueColumnSet       |
| --- | --------------------- |
| 0   | ["bar", "foo", "qux"] |
| 1   | ["bar", "foo"]        |
| 2   | ["foo", "qux"]        |
| 3   | ["foo"]               |

大小提琴

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62393471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档