如何在mysql数据库中进行随机播放?

时间:2018-10-03 18:10:01

标签: mysql shuffle data-masking

假设我有一个包含敏感信息的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中不会洗牌

2 个答案:

答案 0 :(得分: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  |

View on DB Fiddle

答案 1 :(得分:1)

  • 您可以使用会话变量获取行号。
  • 在两个单独的派生表中,获得FristnameLastname(后一个随机排序)。
  • 将它们都加入行号。由于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