2013-08-29 2 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

데이터 sanitisation : 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