2014-12-18 6 views
-2

편집 1 코드는 단지 예일뿐입니다. 나는 교외 데이터가 없습니다. 내 실제 데이터는 계승되고 지저분하며, 데이터베이스에서 코드를 생성하거나 참조 데이터를 생성하여 수정할 수 있습니다. 그 질문은 누군가가 좋은 셀 정렬 기능이나 재사용 할 수있는 다른 솔루션을 갖고있는 것과 같아야합니다. 잭슨;필드에 MYSQL 정렬 단어

CREATE TABLE postcode (
`id` int NOT NULL AUTO_INCREMENT, 
`suburbs` varchar(2000) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_unicode_ci; 

삽입

INSERT INTO postcode (`suburbs`) 
VALUES ('Zackville;Astor;Mary-town;Jackson'); 

원하는 필드는 애 스터

수하는 결과를 정렬하는 메리 마을,

+3

왜 대신 외래 키를 사용하지 않는 SQLFiddle 데모는? – tsnorri

+0

교외에 다른 테이블이 없습니다. – Jus

+1

하나 가져 오십시오. 빨리. – Strawberry

답변

0

Zackville을모든 코멘트에는 매우 유효 점이 있으며 이어야합니다.은 RDBMS에서 구분 된 값으로 작업하는 것을 피하십시오.

기존 데이터베이스에 문제가있어 어떤 이유로 클라이언트 코드가 아닌 데이터베이스 수준에서 수행하려는 경우 집계 테이블을 활용하여 SUBSTRING_INDEX()으로 구분 된 값을 나눌 수 있습니다. 행 다음에 GROUP_CONCAT()을 사용하여 데이터를 정렬 된 방식으로 되돌릴 수 있습니다. 집계 테이블을 생성하는 여러 가지 방법

하나가 집계 테이블의 행

CREATE TABLE tally (n int not null primary key); 
INSERT INTO tally (n) 
SELECT a.N + b.N * 10 + 1 n 
FROM 
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
ORDER BY n 

번호 구분 값의 최대 가능 수보다 크거나 같아야한다. 이제

는 구분 된 값을 리조트 :

UPDATE postcode p JOIN 
(
    SELECT id, GROUP_CONCAT(suburbs ORDER BY suburbs SEPARATOR ';') suburbs 
    FROM 
    (
    SELECT t.id, SUBSTRING_INDEX(SUBSTRING_INDEX(t.suburbs, ';', n.n), ';', -1) suburbs 
     FROM postcode t CROSS JOIN tally n 
    WHERE n.n <= 1 + (LENGTH(t.suburbs) - LENGTH(REPLACE(t.suburbs, ';', ''))) 
) q 
    GROUP BY id 
) s 
    ON p.id = s.id 
    SET p.suburbs = s.suburbs; 

출력 :

여기
 
| ID |       SUBURBS | 
|----|-----------------------------------| 
| 1 | Astor;Jackson;Mary-town;Zackville | 

+0

감사합니다. Peter는 구분 된 값을 피하는 것에 동의합니다. 몇 천 개의 레코드에서 코드를 테스트 해 보았는데,'SET p.suburbs = TRIM (LEADING ';'FROM s.교외);'몇몇 기록에 나오는 주요한 구획을 정돈하십시오. – Jus

+0

테스트 데이터에서 모든 구분 기호 (공백)를 지우지 않았기 때문에 피터의 대답은 정확하고 트림을 사용하지 않고 올바른 것입니다. (감사합니다. Peter. – Jus

+0

@Jus You ' 다시 환영합니다. – peterm