我有一个mysql表,每行可以有任意数量的逗号分隔的单词。例如:
TABLE words
"test, dog, fun, yellow, quick, yellow"
"jogging, academic, fun, jogging, shoulder"
"shoulder, happy, flower, shoulder, shoulder"
我想删除每行中的重复字词。例如,上述内容将成为:
TABLE words
"test, dog, fun, yellow, quick"
"jogging, academic, fun, shoulder"
"shoulder, happy, flower"
(请注意,我只需要删除每行中的重复项。我不需要删除所有行之间的重复项。)
有关实现此目标的最佳方法的任何建议吗?有没有比选择更好的方法,然后一次一行地通过表更新?
提前感谢您的帮助。
答案 0 :(得分:2)
这更适合在SQL之外。如果您尝试使用查询查询字符串,那就不会很好了。我建议:
SELECT
每行$val = explode(', ',$column);
$val = array_unique($val);
,然后UPDATE
使用implode(',',$ val)来表;`。注意:如果需要,您可以节省一些时间并执行strcmp($orig,$new)
和UPDATE
。
答案 1 :(得分:0)
我认为没有比选择更好的方法,然后一次一行地通过表更新。据我所知,SQL只是不支持像那样操纵字符串。您必须取出一个字符串以删除重复项,然后再次将其插入表中。
答案 2 :(得分:0)
这是一个纯粹的mysql版本,你使用一堆数字为每个单词的CROSS JOIN然后你只是DISTINCT连接破碎的单词。如果你有一个主键或唯一键以防行相同的话会有所帮助。 / p>
SELECT GROUP_CONCAT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(t.col, ', ', x.cifre), ', ', -1)) AS words
FROM t
INNER JOIN
(
SELECT 1 + a.i + b.i * 10 cifre, b.i + a.i * 10 sute
FROM (SELECT 0 AS i 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) a
CROSS JOIN (SELECT 0 AS i 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) b
) x
ON (LENGTH(t.col) +1 - LENGTH(REPLACE(t.col, ', ', ''))) >= x.cifre
GROUP BY col