【问题标题】:How to make shuffle in mysql database?如何在 mysql 数据库中进行随机播放?
【发布时间】:2018-10-03 18:10:01
【问题描述】:

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

注意:数据库将由开发人员使用,我不希望他们访问真实信息,所以那些使用 select 的建议无法解决,我看到 Soft DataVeil 这样做但不是在 mysql 中

示例 用户 1 从用户 4 接收姓氏

原始数据

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

【问题讨论】:

  • 如果在姓氏列中获取重复项并不重要,我已经发布了一个可能的答案。
  • "Frist!"" 可能想在它变成化石之前修正那个错字。
  • 谢谢,但使用 select 的那些选项无法解决,因为开发人员不应该看到我编辑帖子以澄清我的疑问的真实信息。
  • 如果你不想让开发者看到“真实”的全名,为什么要全部归还呢?
  • 第一,我使用的信息只是一个例子,同一家银行还有其他值,如电话、cpf 等...... 2. Shuffle 技术使用列 x 的已存储值并更改同一列 x 3 的顺序,我无法更改银行结构如果这与信息屏蔽有关,

标签: mysql shuffle data-masking


【解决方案1】:

如果您不介意“姓氏”列中的重复项
您可以使用具有随机顺序和限制的简单子查询来做到这一点。

查询

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

【讨论】:

  • 谢谢,但使用 select 的那些选项无法解决,因为开发人员不应该看到我编辑帖子以澄清我的疑问的真实信息。
【解决方案2】:
  • 您可以使用会话变量来获取行号。
  • 在两个单独的派生表中,获取FristnameLastname(后一个是随机排序的)。
  • 在行号上加入它们。由于Lastname 是随机排序的,因此Fristname 将得到不同的Lastname
  • 这种方法将确保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

【讨论】:

  • 不错 + 1,但您不必使用 SET 两次,顺便看看这种方法 db-fiddle.com/f/v4M9YodwnnxnfPekZQ2DG5/1.. 这样可以节省您两个执行 SET 查询的时间。
  • @RaymondNijland 感谢 - 更新以删除 set 的使用
  • 在这种方法中也有一个(非常)小的机会,它不会对所有记录进行洗牌并保持非洗牌与源数据相同..
  • @RaymondNijland 是的,但在大多数实际场景中很少发生;假设 OP 拥有至少 1000 行的大数据集,发生这种情况的机会将非常小。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
相关资源
最近更新 更多