2012-09-27 2 views
3

을 붕괴하지 않고 요약 열을 생성 :MySQL은 : 이제 나는이 같은 SQL 테이블이 있다고 가정 해 봅시다 모든 행

UniqueID Word 
1   apple 
2   orange 
3   banana 
4   apple 

내가 정수로 해시 키를 만들려고합니다. 정수는 특정 단어에 매핑되어야합니다. 열쇠가 의미를 가지기 위해서, 그 숫자는 단어의 첫 번째 발생의 UniqueID가되고 싶습니다.

Unique ID Word WordHash 
1   apple 1 
2   orange 2 
3   banana 3 
4   apple 1 

내가 분 (고유 ID)와 함께 문 그룹을 사용하여 시도,하지만이 마지막 사과 행를 제거한다 :이 같은 테이블을 생성하고 싶습니다 의미합니다. 그 줄을 유지하고 싶습니다. 당신이 대신 결과 세트를 얻기의 원래 테이블에 새 열을 만들려면

답변

1
SELECT t.UniqueID, t.Word, q.MinID AS WordHash 
    FROM YourTable t 
     INNER JOIN (SELECT Word, MIN(UniqueID) AS MinID 
         FROM YourTable 
         GROUP BY Word) q 
      ON t.Word = q.Word 
+0

고마워요. 이것은 가장 똑 바른 방법으로 보인다. 그러나 추가 된 내부 조인은 외부 (유일한) select 문에서 조인 및 그룹별로 단어를 비교할 때 쿼리를 상당히 느리게하는 것으로 보입니다 .MySQL은 외부 select 문에서 단어별로 효율적으로 그룹을 수행 할 수 있습니다. 이 속도를 유지하면서 모든 행을 반환하는 방법이있을 것이라는 희망이 있습니다. 아마도 ... –

+2

Word 열에 인덱스가 있습니까? 더 효율적으로 만들어야합니다. – Barmar

+0

MySQL 인덱싱에 대해 알아 봅니다. 유망 해 보입니다. . 내일 이걸 시험해 봐. –

1

는 :

update 
    t 
    inner join (
     select Word, min(UniqueID) as id 
     from t 
     group by Word 
    ) s on t.Word = s.Word  
set t.WordHash = s.id 
1

당신은 다음과 같은 쿼리

ALTER TABLE <table_name> ADD COLUMN `WordHash` INT NULL AFTER `Word`; 

UPDATE <table_name> t INNER JOIN 
    (SELECT `word`, MIN(uniqueId) AS MinID FROM <table_name> GROUP BY `word`) q 
    ON t.word = q.word 
    SET WordHash = q.MinID; 

을 희망를 실행해야 도움이 ...

관련 문제