1

假设我有一个包含敏感信息的 mysql 数据库,并且我想对某些数据进行洗牌,例如将 lastname 列中的值交换为仅来自另一个用户的同一列中的值。

注意:数据库将由开发人员使用,我不希望他们访问真实信息,所以那些使用 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 中进行随机播放

4

2 回答 2

2

如果您不介意 Lastname 列中的重复项,
您可以使用具有随机顺序和限制的简单子查询来完成。

询问

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  |

在 DB Fiddle 上查看

于 2018-10-03T18:21:01.977 回答
1
  • 您可以使用会话变量来获取行号。
  • 在两个单独的派生表中, getFristnameLastname(后一个是随机排序的)。
  • 在行号上加入它们。由于Lastname是随机排序的,因此您将获得不同Lastname的 a 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
于 2018-10-03T18:24:19.600 回答