Как сделать shuffle в базе данных mysql?
Давайте предположим, что у меня есть база данных mysql с конфиденциальной информацией, и я хотел бы сделать перемешивание некоторых данных, таких как обмен значениями из столбца фамилии на значения из того же столбца только от другого пользователя.
Примечание: база данных будет использоваться разработчиками, и я не хочу, чтобы у них был доступ к достоверной информации, поэтому эти предложения, использующие select, не решали бы, я видел, что Soft DataVeil делает это, но не в mysql
Пример User1 получает фамилию от user4
Оригинальные данные
Fristname | Lastname
user1 | lastname1
user2 | lastname2
user3 | lastname 3
user4 | lastname4
user5 | lastname5
Режим перемешивания
Fristname | Lastname
user1 | lastname4
user2 | lastname5
user3 | lastname2
user4 | lastname1
user5 | lastname3
Примечание: я пытался использовать dataveil для этого, но, по-видимому, он не делает случайного воспроизведения в MySQL
2 ответа
Если вы не возражаете против дубликатов в столбце Фамилия
Вы можете сделать это с помощью простого подзапроса со случайным порядком и лимитом.
запрос
SELECT
Table1.Fristname
, (SELECT Table11.Lastname FROM Table1 AS Table11 ORDER BY RAND() LIMIT 1) AS Lastname
FROM
Table1
Возможный результат
| Fristname | Lastname |
| --------- | ---------- |
| user1 | lastname 3 |
| user2 | lastname 3 |
| user3 | lastname 3 |
| user4 | lastname5 |
| user5 | lastname4 |
- Вы можете использовать переменные сессии, чтобы получить номер строки.
- В двух отдельных производных таблицах получаем
Fristname
, а такжеLastname
(последний случайным образом заказан). - Соедините их обоих по номеру строки. поскольку
Lastname
случайным образом, вы получите разныеLastname
дляFristname
, - Такой подход обеспечит отсутствие дубликатов в
Lastname
колонка
Все версии MySQL: попробуйте что-то вроде этого ( SQL Fiddle DEMO):
SELECT t3.Fristname,
t4.Lastname
FROM (
SELECT @rn1 := @rn1 + 1 AS rn1,
t1.Fristname
FROM your_table AS t1
CROSS JOIN ( SELECT @rn1 := 0) AS rnt1
) AS t3
INNER JOIN (
SELECT @rn2 := @rn2 + 1 AS rn2,
t5.Lastname
FROM
(
SELECT t2.Lastname
FROM your_table AS t2
ORDER BY rand()
) AS t5
CROSS JOIN ( SELECT @rn2 := 0) AS rnt2
) AS t4 ON t4.rn2 = t3.rn1