2012-03-21 2 views
0

쉼표로 구분 된 값의 필드가있는 MySQL 테이블이 있습니다. 최대한의 가치를 얻으려면 어떻게해야합니까?MySQL의 쉼표로 구분 된 필드에서 최대 값을 얻으려면 어떻게해야합니까?

예 :

CREATE TABLE `test`.`scale` (`scale` VARCHAR(500)); 

INSERT INTO `test`.scale 
VALUES 
('1,5,0.3,0.8,1'), 
('0.5,0.7,0.1,0.3'), 
('7,0.5,0.7,4'); 

규모 :

1,5,0.3,0.8,1 
0.5,0.7,0.1,0.3 
7,0.5,0.7,4 

답 :이 문자열의 최대 값을 선택하려면 어떻게

5 
0.7 
7 

?

불행히도 이전 사람이 쉼표로 구분 된 솔루션을 구현 한 방식을 변경할 수 없습니다. 나를 도울 수있는 MySQL 함수가 있기를 바란다. 그렇지 않으면 좀 더러운 PHP 작업을해야 할 것이다.

+5

값을 저장하지 마십시오. http://gtowey.blogspot.com/2009/12/how-to-fix-comma-separated-list-of-doom.html – TehShrike

+0

다시 연락해 주셔서 감사합니다. 아니, 행 기반이 아니야. 테스트 작성 문을 사용하여 질문을 업데이트하겠습니다. – richie

답변

2

SQL에 문자열 분할 기능이 없다고 생각합니다. Here's some code that claims to do it,하지만 그것을 테스트하지 않았습니다.

더 깊은 이유는 SQL이 사용자가 데이터를 normalized form에 저장하기를 절실히 요구하기 때문입니다. 이 경우, 모든 필드는 단일 행의 제목에 대한 데이터 조각을 나타내야 함을 의미합니다.

기본적으로 scaleanswer을 두 개의 개별 테이블에 저장합니다. 각 테이블은 각각의 질문에 대한 ID를 사용하여 서로 일치시킬 수 있습니다. 스케일은 스케일 옵션 당 하나의 행, 규모 별없는 하나 개의 행이있을 것입니다 :

OPTIONS      ANSWERS 
question | scaleoption  question | answer 
---------|------------  ---------|------- 
     1 | 1.5     1 | 5 
     1 | .3      2 | .7 
     1 | .8    ... 
     1 | 1 
     2 | .5 
     2 | .7 
... 

그런 다음이 형식은 또한 당신이 할 수 있습니다 질문 2에 대한 최대 옵션을 얻을 수있는 쿼리 select max(scaleoption) from options where question = 2를 사용할 수있는 모든 질문에 어디에서 찾을 수 같은 것들 옵션 중 하나는 1이며 특정 질문에 몇 개의 옵션이 있는지 계산합니다. 좀 더 복잡 해 보이지만 일을 유연하고 확장 가능하며 이식 가능한 방법입니다.

현재 형식을 사용하려면 전체 문자열을 반환하고 다른 프로그래밍 언어로 해체해야합니다.

+0

MySQL에는 문자열을 분할하는 기능이 없습니다. 다른 DBMS (예 : PostgreSQL)에는 그러한 기능이 있으며 쉼표로 구분 된 목록을 "표"로 바꿀 수 있습니다. –

+0

감사합니다. 유일한 해결책 일 것 같았습니다. – richie

+0

@a_horse_with_no_name 감사합니다. 알고 있으면 유용합니다! – octern

0

커서를 사용하여 각 행을 페치하고 중첩 된 substring_index를 사용하여 모든 쉼표로 구분 된 필드를 분리 한 후 새 테이블에 삽입 한 다음이 새 테이블에서 최대 값을 선택하고 커서를 사용하여 루프를 설정하여 전체 테이블 및 저장소 새 테이블의 각 행의 최대 값. 마지막에는 최종 테이블에서 *를 선택하십시오.

관련 문제