如何从mysql列中存在的所有行中删除重复值[duplicate]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我陷入了这样一种情况:在我的表中,我对列中的每一行都有多个重复值,并且表格看起来像

User_Id    |   Color
-----------+-------------------------------
1          |  Red, Blue, Red,Green
2          |  Green,Green,Blue,Blue, Red
3          |  Black, White
4          |  Red,Red,Red

我想从列颜色中删除或删除每个重复值,以便每个user_id只保留唯一值。

User_Id    |   Color
-----------+--------------------
1          | Red, Blue,Green
2          | Green, Blue, Red
3          | Black,White
4          | Red

有没有办法达到理想的输出?我搜索了很多但什么都没得到。

您的宝贵意见将受到高度赞赏。

mysql
1个回答
0
投票

有什么方法可以实现所需的输出,我搜索了很多但什么也没得到。您的宝贵意见将受到高度赞赏。

就像我已经说过你应该规范化一样,分隔列表不能强制执行唯一性:无法在不编写应用程序代码或触发器的情况下插入和更新时阻止Red, Blue, Red, Green, Blue。这也意味着获取完整的数据。

如果你没有规范化,那么你将需要具有创造性,使用SQL数字生成器和嵌套的SUBSTRING_INDEX()函数以及CROSS JOIN来分割字符串。并使用GROUP BYGROUP_CONCAT(DISTINCT ..)来制作独特的价值观

您不希望这样做,此查询显示查询在分隔列表上的难度

询问

SELECT 
 DISTINCT  
     t.User_Id
    , GROUP_CONCAT(DISTINCT TRIM(SUBSTRING_INDEX(
          SUBSTRING_INDEX(
              t.Color
            , ','
            , sql_number_generator.number
          )
          , ','
          , -1
        )
     )) AS color
FROM (

SELECT 
 @row := @row + 1 AS number
FROM (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
  SELECT @row := 0 
) init_user_params 

) AS sql_number_generator
CROSS JOIN 
 t
GROUP BY
 t.User_Id

结果

| User_Id | color          |
| ------- | -------------- |
| 1       | Blue,Green,Red |
| 2       | Blue,Green,Red |
| 3       | Black,White    |
| 4       | Red            |

demo

但问题是如何用这个结果更新颜色列,我试过但它抛出一个错误[操作数应该包含1列],我无法理解它是如何完成的

仍然不能相信你愿意继续这种方法。警告之后

UPDATE 
 t 
INNER JOIN (

SELECT 
 DISTINCT  
     t.User_Id
    , GROUP_CONCAT(DISTINCT TRIM(SUBSTRING_INDEX(
          SUBSTRING_INDEX(
              t.Color
            , ','
            , sql_number_generator.number
          )
          , ','
          , -1
        )
     )) AS color
FROM (

SELECT 
 @row := @row + 1 AS number
FROM (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row1
CROSS JOIN (
  SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) row2
CROSS JOIN (
  SELECT @row := 0 
) init_user_params 

) AS sql_number_generator
CROSS JOIN 
 t
GROUP BY
 t.User_Id

) AS records_to_updated

SET t.Color = records_to_updated.color

WHERE 
  t.User_Id =  records_to_updated.User_Id

demo

© www.soinside.com 2019 - 2024. All rights reserved.