2013-07-19 3 views
2

결과의 각 행에 대해 0부터 시작하는 연결된 행의 각 문자열에 증분 값을 지정해야합니다.MySQL GROUP_CONCAT 증분 값 지정

number|color_set 
1  |0 red,1 blue,2 orange 
2  |3 brown 
3  |4 purple,5 yellow 

이 무엇을이다 : 이것은 내가 할 그 결과

number|color_set 
1  |0 red,1 blue,2 orange 
2  |0 brown 
3  |0 purple,1 yellow 

: 이것은 내가 원하는 결과가

number|color 
1  |red 
1  |blue 
1  |orange 
2  |brown 
3  |purple 
3  |yellow 

: 여기

은 단순화 된 데이터 샘플입니다 나는 노력해왔다 :

SET @x:=0; 

SELECT number, GROUP_CONCAT(@x:[email protected]+1,' ',color SEPARATOR ',') 
FROM table 
GROUP BY number; 

각 결과 행마다 변수를 0으로 재설정해야합니다. 나는 분명히 전문가가 아니기 때문에 사이트에 처음 온 사람이라면 도움이 될 것입니다.

감사합니다,

제이 방법은 2 단계의 솔루션에 대해

+1

왜이 작업을 수행하려고합니까? 궁극적으로 달성하려는 것은 무엇입니까? – Strawberry

+1

@Strawberry와 동의하십시오. 이런 식으로'GROUP_CONCAT()'을 사용하는 것보다 응용 프로그램 계층에서 그룹화를 수행하는 것이 더 좋습니다. – eggyal

+0

문제는 mysql에 '자연스러운 순서'가 없으므로 1이 아닌 0을 나타내는 이유는 없습니다 – Strawberry

답변

1

... 그냥 재미 또한

CREATE TABLE colors(color_set INT NOT NULL,color VARCHAR(12) NOT NULL,PRIMARY KEY (color_set,color)); 

INSERT INTO colors VALUES 
(1  ,'red'), 
(1  ,'blue'), 
(1  ,'orange'), 
(2  ,'brown'), 
(3  ,'purple'), 
(3  ,'yellow'); 


     SELECT color_set 
     , GROUP_CONCAT(CONCAT_WS(' ',n,color) ORDER BY n) array 
    FROM 
     (SELECT c.* 
      , FIND_IN_SET(color,x)-1 n 
      FROM colors c 
      JOIN 
      (SELECT color_set 
        , GROUP_CONCAT(color ORDER BY LENGTH(color),color) x 
       FROM colors 
       GROUP 
        BY color_set 
      ) y 
      ON y.color_set = c.color_set 
    ) z 
    GROUP 
    BY color_set; 

+-----------+-----------------------+ 
| color_set | array     | 
+-----------+-----------------------+ 
|   1 | 0 red,1 blue,2 orange | 
|   2 | 0 brown    | 
|   3 | 0 purple,1 yellow  | 
+-----------+-----------------------+ 
+0

안녕하세요, 답변 해 주셔서 감사합니다. 이것은 완벽하게 작동했습니다. 고마워, 제이 – jgc9876

0

? 아니면 1 SQL 쿼리 만 있어야합니까?

  1. (ID, 색상)와 임시 테이블을 생성, (INSERT INTO ttTable SELECT color FROM datatable WHERE number = 3)를 자동 증가로 ID를 선언하면 변형 원하는 기록 중 0 (ALTER TABLE tbl AUTO_INCREMENT = 0;)에 자동 증가의 시작
  2. 선택하고 삽입을 설정 그런 다음 다시 읽어서 GROUP_CONCAT을 통해 목록을 생성하십시오. 원래 표의 모든 숫자에 대해이 단계를 반복해야합니다. 그냥 재미를 위해
+0

안녕하십니까. 응답 해 주셔서 감사합니다. 이 쿼리를 기존 SQL 쿼리에 추가해야합니다. 고마워, Jay – jgc9876

0

...

SELECT 
number, 
GROUP_CONCAT(CONCAT(counter, ' ', color)) 
FROM (
SELECT 
number, 
color, 
@counter := CASE WHEN @prev = number THEN @counter + 1 ELSE 0 END AS counter, 
@prev := number 
FROM 
yourTable yt 
, (SELECT @counter:=0, @prev:=NULL) vars 
) sq 
GROUP BY number 
+0

안녕하세요, 답변 해 주셔서 감사합니다. 이것은 원하는 결과를주지 못했습니다. 값은 0에서 시작하지 않았고 순차적이지 않았습니다. 고마워, Jay – jgc9876

+1

그런 다음 편집 된 답변 에서처럼 1을 0으로 변경하십시오. 그것과는 별개로 Strawberry 's와 동일합니다. 내가 너에게 조금 생각을 떠난 것을 유감스럽게 생각한다. – fancyPants

3

라이브 작업 참조 이것은 대답되었지만 쉬운 방법이 아닙니까? select에 @x : = 0을 그냥 추가 하시겠습니까?

SET @x : = 0;

SELECT 번호, GROUP_CONCAT (@x : = @ x + 1, '', color SEPARATOR ','), @ x : = 0 FROM 테이블 GROUP BY 번호;

+0

고마워요. 이것은 매우 도움이되고 최단 해결책입니다 :) – Waqas