Перемешать значения в ячейке MySQL

Есть таблица contents, которая содержит 13 столбцов и от 1,5 до 6 млн строк.

таблица <code>contents</code>

Столбец rel_tags (varchar(250), utf8_general_ci) содержит в ячейках список значений с разделителем запятая.
(пример: 100 dollar bill,dollar bill,bill cosby,bill cipher,dollar,dollar sign).
Ячейка может содержать от нуля (ячейка может быть пустой) до шести значений с разделителем запятая. Значения между разделителем могут содержать буквы, цифры, пробелы и знаки %#&@!.

Нужно рандомно перемешать значения в каждой ячейке столбца rel_tags.

Например,
было: 100 dollar bill,dollar bill,bill cosby,bill cipher,dollar,dollar sign
стало: bill cosby, dollar sign, 100 dollar bill, bill cipher, dollar bill, dollar

Делать это нужно будет разово, после импорта в MySQL данных из csv файла.


P.S. В Excel справляться с этой задачей мне помогала такая функция:

Function ShufflePhrases$(s$, delim$)
    Dim arr$(), i, c%
    arr = Split(s, delim)
    Randomize
    c = UBound(arr)
    For i = 1 To c
        swap arr(Rnd * c), arr(Rnd(Timer) * c)
    Next
    ShufflePhrases = Join(arr, delim)
End Function
Sub swap(ByRef a, ByRef b)
    Dim c
    c = a: a = b: b = c
End Sub

Ответы (1 шт):

Автор решения: Akina

Решение для MySQL версии 8.

Перемешивание при выборке:

SELECT test.id, GROUP_CONCAT(jsontable.value ORDER BY RAND()) shuffled_tags
FROM test
CROSS JOIN JSON_TABLE( CONCAT('["', REPLACE(test.tags, ',', '","'), '"]'),
                       "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                     ) AS jsontable
GROUP BY test.id;

Обновление:

UPDATE test, ( SELECT test.id, GROUP_CONCAT(jsontable.value ORDER BY RAND()) tags
               FROM test
               CROSS JOIN JSON_TABLE( CONCAT('["', REPLACE(test.tags, ',', '","'), '"]'),
                                      "$[*]" COLUMNS( value VARCHAR(254) PATH "$" )
                                    ) AS jsontable
               GROUP BY test.id ) shuffled
SET test.tags = shuffled.tags
WHERE test.id = shuffled.id;

fiddle

→ Ссылка