여러 MySQL 행을 하나의 필드로 연결할 수 있습니까?


1214

를 사용하면 MySQL다음과 같은 작업을 수행 할 수 있습니다.

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

내 결과 :

shopping
fishing
coding

그러나 대신 1 행 1 열을 원합니다.

예상 출력 :

shopping, fishing, coding

그 이유는 여러 테이블에서 여러 값을 선택하고 모든 조인 후에 원하는 것보다 많은 행을 얻었 기 때문입니다.

나는의 기능을 위해 검토 한 MySQL의 문서 등이 보이지 않는 CONCAT또는 CONCAT_WS기능은 결과 세트를 승인.

그래서 여기 누구든지 이것을하는 방법을 알고 있습니까?


9
: 난 그냥 당신에게 유용 할 수 GROUP_CONCAT을 사용하는 방법에 대한 약간의 데모 쓴 giombetti.com/2013/06/06/mysql-group_concat
마크 Giombetti

답변:


1738

당신은 사용할 수 있습니다 GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

Ludwig가 자신의 의견 에서 언급했듯이 DISTINCT중복을 피하기 위해 연산자를 추가 할 수 있습니다 .

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies 
GROUP BY person_id;

Jan 이 의견 에서 언급했듯이 다음을 사용하여 값을 내포하기 전에 값을 정렬 할 수도 있습니다 ORDER BY.

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;

Dag가 그의 의견 에서 언급했듯이 결과에는 1024 바이트 제한이 있습니다. 이 문제를 해결하려면 쿼리 전에이 쿼리를 실행하십시오.

SET group_concat_max_len = 2048;

물론 2048필요에 따라 변경할 수 있습니다 . 값을 계산하고 할당하려면

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies 
    GROUP BY person_id)
    AS UNSIGNED
);

154
결과 열에서 1024 바이트의 제한을 인식하십시오 (모수 group_concat_max_len 참조 )
Dag

81
그리고 DISTINCT매개 변수를 추가하면 복식이 발생하지 않습니다. ... GROUP_CONCAT(DISTINCT hobbies)
Ludwig

3
하나의 열에서 모든 데이터를 가져와야했습니다. 이를 위해 GROUP BY 절을 사용하지 마십시오. 예 : SELECT GROUP_CONCAT (이메일 SEPARATOR ',') FROM users;
Jonathan Bergeron

1
고마워, 나는 그룹 concat 길이 제한이 있다는 것을 몰랐다. 내가 만든 몬스터 목록을 돌아 다니기 위해 필요했습니다.
Patrick

9
결과로 생성 된 문자열에서 취미를 정렬하려면 다음을 사용하십시오.SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ') FROM peoples_hobbies GROUP BY person_id
Jan

106

한 번 봐 가지고 GROUP_CONCAT당신의 MySQL 버전 (4.1)을 지원하는 경우입니다. 자세한 내용 은 설명서 를 참조하십시오.

다음과 같이 보일 것입니다 :

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

11
나는 그 생각 group by 'all'이 모든 행 문자열에 할당하기 때문에, (또한 원치 않는) 필요하지 않습니다 all및 다음 이러한 행 사이의 문자열을 비교합니다. 내가 맞아?
Krzysiek

74

여러 개의 개별 행 을 연결 하는 대체 구문

경고 :이 게시물은 배고프다.

주어진:

그룹 대신 여러 개의 개별 행선택 하고 특정 필드를 연결하려고합니다.

제품 ID와 이름 및 가격 테이블이 있다고 가정 해 보겠습니다.

+------------+--------------------+-------+
| product_id | name               | price |
+------------+--------------------+-------+
|         13 | Double Double      |     5 |
|         14 | Neapolitan Shake   |     2 |
|         15 | Animal Style Fries |     3 |
|         16 | Root Beer          |     2 |
|         17 | Lame T-Shirt       |    15 |
+------------+--------------------+-------+

그런 다음이 강아지를 체크 박스로 표시하는 멋진 스 약시 아약스가 있습니다.

배고픈 힙합 사용자가을 선택합니다 13, 15, 16. 그녀에게 오늘 디저트는 없습니다 ...

찾기:

순수 mysql을 사용하여 사용자의 주문을 한 줄로 요약하는 방법.

해결책:

사용 GROUP_CONCAT :IN

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

어떤 출력 :

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

보너스 솔루션 :

당신이 총 가격을 원한다면 SUM():

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary                                  | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer |    10 |
+------------------------------------------------+-------+

추신 : 근처에 In-N-Out 이없는 경우 사과하십시오 ...


11
이것이 좋은 대답이지만 순수한 대답보다 광고처럼 들립니다. 여전히 좋은 형식의 답변입니다.
FliiFe

1
도움을받을 수 있습니까? stackoverflow.com/q/60278898/11697039 @elbowlobstercowstand
zus

39

매개 변수 GROUP_CONCAT를 설정하여 값 의 최대 길이를 변경할 수 있습니다 group_concat_max_len.

MySQL 문서 에서 자세한 내용을 참조하십시오 .



25

필자의 경우 ID 행이 있었고 char로 캐스팅해야했습니다. 그렇지 않으면 결과가 이진 형식으로 인코딩되었습니다.

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

1
감사! CAST내가 [BLOB - 14 Bytes]결과와 같은 가치가 없었다면 !
Mel_T

1
도움을받을 수 있습니까? stackoverflow.com/q/60278898/11697039 @Fedir RYKHTIK
zus

16

다음과 같이 MySQL (5.6.13) 세션 변수와 대입 연산자를 사용하십시오.

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

그럼 당신은 얻을 수 있습니다

test1,test11

2
GROUP_CONCAT보다 빠릅니까?
jave.web

1
테스트 테이블 의 설명 열 (varchar (50))에 MySQL 서버 v5.6.17이있는 PHPMyAdmin 에서이를 테스트 했지만 각 레코드에 대한 BLOB 필드를 반환합니다.SELECT @logmsg := CONCAT_ws(',',@logmsg,description) from test
Jan

14

더 복잡한 쿼리가 있었고 GROUP_CONCAT외부 쿼리에서 사용해야 작동한다는 것을 알았습니다 .

원래 검색어 :

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

내포 :

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

이것이 누군가를 도울 수 있기를 바랍니다.


9

GROUP_CONCAT하위 쿼리와 함께 사용하는 방법을 여기에서 찾고있는 사람 -이 예제 게시

SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid

따라서 GROUP_CONCAT하위 쿼리 내부를 감싸지 말고 사용해야합니다.


1
이것은 내가 찾던 것
bumerang

7

이 시도:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

2
이것이 내가 얻은 것입니다 : '인식 할 수없는 문장 유형. (0 위치의 "DECLARE"근처) '
Istiaque Ahmed

1

MySql에서 열을 연결하는 두 가지 방법이 있습니다

select concat(hobbies) as `Hobbies` from people_hobbies where 1

또는

select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.