在JOIN查询中生成匿名ID

时间:2018-12-13 13:50:11

标签: mysql sql

任务是从敏感系统中提取客户和订单数据。数据存储在MySQL数据库中。

一个客户可以与许多订单相关联。一个简单的LEFT JOIN即可准确满足我的需求:

---------------------------------------------------------
| customer_id | order_id | order_quantity | order_value |
---------------------------------------------------------
|      1      |    100   |       3        |    100.00   |
|      1      |    105   |      12        |    400.00   |
|      2      |    103   |       2        |     75.00   |
---------------------------------------------------------

但是,在生成的摘录中,不允许我显示customer_idorder_id。相反,这些ID必须替换为数据导出时生成的随机的匿名标识符。

仍然需要在提取的数据导出结果中维护客户与其订单之间的关系。

所需结果:

-------------------------------------------------------------------
| anon_customer_id | anon_order_id | order_quantity | order_value |
-------------------------------------------------------------------
|         xyz      |      abc123   |       3        |    100.00   |
|         xyz      |      def567   |      12        |    400.00   |
|         pqr      |      hij890   |       2        |     75.00   |
-------------------------------------------------------------------

是否有一种方法可以生成anon_customer_idanon_order_id作为我正在构建数据结果的SELECT的一部分?

2 个答案:

答案 0 :(得分:2)

一种选择是使用MySQL的本机加密方法,例如SHA1SHA2,然后创建一个VIEW进行查询并加入。
我选择使用SHA 512,因为它具有非常低的概率,不同的数据可以生成相同的哈希值。

CREATE VIEW Table1_VIEW AS (
   SELECT 
      <table>.*
    , SHA2(<table>.customer_id, 512) AS anon_customer_id
    , SHA2(<table>.order_id, 512) AS anon_order_id
   FROM 
    <table>
 )

查询和结果

SELECT 
 *
FROM 
 Table1_VIEW

| customer_id | order_id | order_quantity | order_value | anon_customer_id                                                                                                                 | anon_order_id                                                                                                                    |
| ----------- | -------- | -------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| 1           | 100      | 3              | 100         | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a | 643c30f73a3017050b287794fc8c5bb9ab06b9ce38a1fc58df402a8b66ff58f69bf0a606ae17585352a0306f0e9752de8c5c064aed7003f52808b43ff992a603 |
| 1           | 105      | 12             | 400         | 4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a | 03d25c7071bce10d6b462d53854b969d9f61b982e3aee8771bdcca1ecb70495574e6929042f52e859ee9a253b58f776514180ff16e1338f5505e86c7ff328f72 |
| 2           | 103      | 2              | 75          | 40b244112641dd78dd4f93b6c9190dd46e0099194d5a44257b7efad6ef9ff4683da1eda0244448cb343aa688f5d3efd7314dafe580ac0bcbf115aeca9e8dc114 | 947de04bfae0bf062a66fc055d4c284c9779793d9bd58833ee7549fde1ff1effaf7aefdbc6c90ed0ac86c0acc82329e7c057d900c28ea7ed4724486f717ee38d |

demo

p.s您也可以直接在SHA2()课间直接使用JOIN

示例查询

SELECT 
      table11.*
    , SHA2(table11.customer_id, 512) AS anon_customer_id
    , SHA2(table11.order_id, 512) AS anon_order_id 
FROM 
 Table1 table11
LEFT JOIN
 Table1 table12
ON
 table11.customer_id = table12.customer_id

demo

仅适用于MYSQL 5.7 +

如果您至少拥有MySQL 5.7+,那么您还有一个更好的选择。
就是generated columns

CREATE TABLE Table1 (
  `customer_id` INTEGER,
  `order_id` INTEGER,
  `order_quantity` INTEGER,
  `order_value` INTEGER,
  anon_customer_id VARCHAR(255) AS ( SHA2(Table1.customer_id, 512) ) VIRTUAL,
  anon_order_id VARCHAR(255) AS ( SHA2(Table1.order_id, 512) ) VIRTUAL
);

demo

答案 1 :(得分:0)

您可以使用任何哈希函数,例如MD5:

SELECT MD5(customer_id) AS anon_customer_id FROM customers;

但是请注意,MD5并不是很安全:https://security.stackexchange.com/questions/19906/is-md5-considered-insecure