Как сделать 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  |

Посмотреть на БД Fiddle

  • Вы можете использовать переменные сессии, чтобы получить номер строки.
  • В двух отдельных производных таблицах получаем 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
Другие вопросы по тегам