如何在mysql数据库中进行shuffle?

2w2cym1i  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(570)

假设我有一个包含敏感信息的mysql数据库,并且我想对一些数据进行无序处理,比如用lastname列中的值交换lastname列中的值,而只交换来自另一个用户的同一列中的值。
注意:数据库将由开发人员使用,我不希望他们能够访问真实的信息,因此使用select的建议无法解决问题,我看到softdataveil可以做到这一点,但在mysql中没有
示例user1从user4接收lastname
原始数据

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中不执行shuffle

hgncfbus

hgncfbus1#

您可以使用会话变量来获取行号。
在两个独立的派生表中,获取 Fristname ,和 Lastname (后者随机排列)。
把他们两个连在一起。自 Lastname 是随机排列的,你会得到不同的 Lastname 为了一个 Fristname .
这种方法将确保系统中没有重复项 Lastname
mysql的所有版本:尝试以下操作(SQLFiddle演示):

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
cwdobuhd

cwdobuhd2#

如果你不介意在姓氏一栏重复
您可以用一个简单的子查询来完成它,子查询的顺序和限制是随机的。
查询

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视图

相关问题