Перемешать значения в ячейке MySQL
Есть таблица contents, которая содержит 13 столбцов и от 1,5 до 6 млн строк.
Столбец 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 шт):
Решение для 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;
