를 사용하면 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을 사용하여 사용자의 주문을 한 줄로 요약하는 방법.
해결책:
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
