2013-08-29 21 views
3

在找不到符合我需求的任何內容之後,我編寫了這段代碼來一致地對mysql中列的值進行洗牌。有一個更好的方法嗎?如何在MySql中對列進行洗牌

**Original table:** 
+----+-----------+ 
| id | fname  | 
+----+-----------+ 
| 1 | mike  | 
| 2 | ricky  | 
| 3 | jane  | 
| 4 | august | 
| 6 | dave  | 
| 9 | Jérôme | 
+----+-----------+ 

**Possible output:** 
+----+-----------+ 
| id | fname  | 
+----+-----------+ 
| 1 | dave  | 
| 2 | jane  | 
| 3 | mike  | 
| 4 | ricky  | 
| 6 | Jérôme | 
| 9 | august | 
+----+-----------+ 

DROP TEMPORARY TABLE IF EXISTS shuffle1; 
DROP TEMPORARY TABLE IF EXISTS shuffle2; 
CREATE TEMPORARY TABLE shuffle1 (id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), original_values varchar(255), key original_values(original_values)); 
CREATE TEMPORARY TABLE shuffle2 (id int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id), original_ids int(11), key original_ids(original_ids)); 
INSERT INTO shuffle1 (id, original_values) SELECT NULL, table1.fname FROM table1 ORDER BY rand(); 
INSERT INTO shuffle2 (id, original_ids) SELECT NULL, table1.id FROM table1; 
UPDATE table1 SET table1.fname = (SELECT shuffle1.original_values FROM shuffle1 JOIN shuffle2 ON shuffle2.id = shuffle1.id WHERE table1.id = shuffle2.original_ids); 
+1

什麼是你的目標嗎? – tadman

+1

數據安全:假設您有一個包含您的客戶端列表的生產表,其中包含兩列 - first_name和last_name,您希望在測試環境中使用它,但此信息非常敏感。洗牌一欄保留了用戶的所有原始值和隱私。 – Ronna

+0

您可能要做的是複製整個數據庫,然後對特定列的值進行加擾,將其替換爲隨機數據。至少可以說,你在這裏做的事情相當混亂。 – tadman

回答

-1
UPDATE table1 SET fname=(SELECT t.fname FROM(SELECT fname FROM table1) t ORDER BY RAND() LIMIT 1) 
+1

這不是一個洗牌代碼,因爲它不能保證原始列中的所有值都會顯示在結果中。所有原始值都需要在那裏,只是按不同的順序。 – Ronna