SQL

2011-12-12 2 views
2
내가 제대로 같은 번호의 구분 된 그룹이 포함 된 문자열 컬럼 주문해야

에 숫자로 구분 된 문자열을 주문하는 방법 : 예를 1을 위해 :이 숫자는 트리를 정의하는 데 사용됩니다SQL

1 
1.1 
1.1.1 
1.2 
1.2.1 
1.10 
2 
2.1 

2은 최상위 노드이며 1.1, 1.21.101의 직계 하위 항목입니다. 트리는 임의로 깊을 수 있으므로 각 항목에있는 기간의 수에 상한이 없습니다 (실제로 열에 글자 수 제한이 적용됩니다).

문제점은 SQL에서 표준 ORDER BY 작업이 1.10보다 앞에 표시되고 1.2보다 우선합니다. 이것은 당연히 예상되지만, 불행히도 내가 원하는 바가 아닙니다. 10 > 2부터. 주문하는 효율적인 방법이 있습니까? MySQL을 사용하고 있습니다.

트리에 대해이 인코딩을 사용하는 것이 반드시 필요한 것은 아니므로 제안하기가 쉽지 않은 다른 인코딩이 있으면 그렇게하는 것이 좋습니다. 그러나이 구조가 제공하는 좋은 점은 한 패스에서 모든 상위 부모 노드 또는 모든 하위 노드를 쉽게 복구 할 수 있다는 것입니다.이 노드는보다 일반적인 행/parent_row 모델에서 작동하는 것이 아닙니다 (멀리까지 내가 아는 한). 예를 들어, ID가 1.2.1.4.5 인 경우 네 개의 조상은 1, 1.2, 1.2.11.2.1.4이며 모든 자식 (직계 하위 항목과 하위 항목 모두)의 ID는 1.2.1.4.5.으로 시작합니다.

+0

트리가 얼마나 깊습니까? 얼마나 많은 최상위 노드? 상한도 없습니까? – Riyono

+0

"더 나은"구조체에 대한이 질문을보십시오. http://stackoverflow.com/questions/5916482/php-mysql-best-tree-structure –

+0

@Riyono : 실제로 나무는 10 레벨보다 깊어지지 않을 것입니다. – Abiel

답변

0

@Abiel, 각 노드에 50 명 이상의 직접적인 하위 노드가없는 경우 (62 개의 하위 노드가 충분할 것임)에 기반하여 @Bohemian이 의견에 언급 한대로 컴퓨터에서 읽을 수있는 코드 0-9A-Za-z (Base 62 Encoding)을 사용하면 새로운 VARCHAR(255) BINARY 열을 정렬 할 수 있습니다. 이미 알 수 있듯이

CREATE TABLE `test`.`tree` (
    `computer_readable` VARCHAR(255) BINARY NOT NULL , 
    `human_readable` VARCHAR(255) NOT NULL , 
    `title` VARCHAR(255) NOT NULL , 
    PRIMARY KEY ( `computer_readable`) , 
    INDEX ( `human_readable`) 
); 

computer_readableBINARY로 정의됩니다, 그래서 우리는 각 노드에 대해 최대 62 [0-9A-Za-z] (대신 36 [0-9a-z]) 자식 노드를 가질 수있다.

mysql> SELECT 'a' = 'A'; 
+-----------+ 
| 'a' = 'A' | 
+-----------+ 
|   1 | 
+-----------+ 
1 row in set (0.00 sec) 

mysql> SELECT BINARY 'a' = 'A'; 
+------------------+ 
| BINARY 'a' = 'A' | 
+------------------+ 
|    0 | 
+------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT BINARY 'a' > 'A'; 
+------------------+ 
| BINARY 'a' > 'A' | 
+------------------+ 
|    1 | 
+------------------+ 
1 row in set (0.00 sec) 

그래서,이 새로운 분야로, 우리는 (아래 CSV에 명시된)이 형식의 데이터를 할 수 :

"1";"1";"Books" 
"11";"1.1";"Fiction" 
"111";"1.1.1";"Science-Fiction" 
"12";"1.2";"Self-Help" 
"121";"1.2.1";"Motivational" 
"1A";"1.10";"Textbooks" 
"1e";"1.40";"Coloring Books" 
"2";"2";"Music" 
"21";"2.1";"Classical" 

MySQL을 것이다 행복하게 종류에 대한 우리

mysql> SELECT * FROM `tree` ORDER BY `computer_readable`; 
+-------------------+----------------+-----------------+ 
| computer_readable | human_readable | title   | 
+-------------------+----------------+-----------------+ 
| 1     | 1    | Books   | 
| 11    | 1.1   | Fiction   | 
| 111    | 1.1.1   | Science-Fiction | 
| 12    | 1.2   | Self-Help  | 
| 121    | 1.2.1   | Motivational | 
| 1A    | 1.10   | Textbooks  | 
| 1e    | 1.40   | Coloring Books | 
| 2     | 2    | Music   | 
| 21    | 2.1   | Classical  | 
+-------------------+----------------+-----------------+ 
9 rows in set (0.00 sec) 

을 희망이 도움이됩니다.