Лучший способ удалить повторяющиеся слова из каждой строки в таблице MySQL - PullRequest
1 голос
/ 13 декабря 2010

У меня есть таблица 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 ]

2 голосов
/ 13 декабря 2010

Это лучше подходит вне SQL.Это не будет красиво, если вы попытаетесь опросить строки с помощью запроса.Я рекомендую:

  • SELECT в каждой строке
  • , выполнив $val = explode(', ',$column);
  • с $val = array_unique($val);, затем
  • UPDATE при входе в таблицу с помощью implode (',', $ val); `.

примечание: вы можете сэкономить время и сделать strcmp($orig,$new) и только UPDATE, если необходимо.

0 голосов
/ 02 января 2016

Это чистая версия mysql, в которой вы используете связку чисел для CROSS JOIN для каждого слова, а затем просто DISTINCT связывает пропущенные слова. Было бы полезно, если у вас есть первичный или уникальный ключ, если строки совпадают.

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

0 голосов
/ 13 декабря 2010

Я не думаю, что есть лучший способ, чем ВЫБОР, а затем ОБНОВЛЕНИЕ по таблице по одной строке за раз. Как я знаю, SQL просто не поддерживает манипулирование такими строками. Вы должны удалить строку, чтобы удалить дубликаты, а затем снова вставить ее в таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...