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

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

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

내 결과 :

shopping
fishing
coding

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

예상 출력 :

shopping, fishing, coding

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

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

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



답변

당신은 사용할 수 있습니다 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
);


답변

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

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

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


답변

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

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

주어진:

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

제품 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 이없는 경우 사과하십시오 …


답변

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

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


답변

GROUP Aggregate 함수 GROUP_CONCAT이 있습니다.


답변

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

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


답변

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

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

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

test1,test11