如何从mysql列中存在的所有行中删除重复值[duplicate]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从mysql列中存在的所有行中删除重复值[duplicate]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我陷入了这样一种情况:在我的表中,我对列中的每一行都有多个重复值,并且表格看起来像
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
有没有办法达到理想的输出?我搜索了很多但什么都没得到。
您的宝贵意见将受到高度赞赏。
答案
有什么方法可以实现所需的输出,我搜索了很多但什么也没得到。您的宝贵意见将受到高度赞赏。
就像我已经说过你应该规范化一样,分隔列表不能强制执行唯一性:无法在不编写应用程序代码或触发器的情况下插入和更新时阻止Red, Blue, Red, Green, Blue
。这也意味着获取完整的数据。
如果你没有规范化,那么你将需要具有创造性,使用SQL数字生成器和嵌套的SUBSTRING_INDEX()
函数以及CROSS JOIN
来分割字符串。并使用GROUP BY
和GROUP_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
以上是关于如何从mysql列中存在的所有行中删除重复值[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章