从mysql表中的每一行中删除重复单词的最佳方法

时间:2010-12-13 01:51:23

标签: php mysql string

我有一个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"

(请注意,我只需要删除每行中的重复项。我不需要删除所有行之间的重复项。)

有关实现此目标的最佳方法的任何建议吗?有没有比选择更好的方法,然后一次一行地通过表更新?

提前感谢您的帮助。

3 个答案:

答案 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

FIDDLE