질문자 :Dean Rather
MySQL
사용하여 다음과 같이 할 수 있습니다.
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
내 출력:
shopping fishing coding
그러나 대신 1 행, 1 열을 원합니다.
예상 출력:
shopping, fishing, coding
그 이유는 여러 테이블에서 여러 값을 선택하고 있고 모든 조인 후에 원하는 것보다 훨씬 더 많은 행이 있기 때문입니다.
MySQL Doc 에서 함수를 찾았 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);
Community WikiMySQL 버전(4.1)이 지원하는 경우 GROUP_CONCAT
살펴보십시오. 자세한 내용 은 설명서 를 참조하십시오.
다음과 같이 보일 것입니다.
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') FROM peoples_hobbies WHERE person_id = 5 GROUP BY 'all';
lpfavreau여러 개별 행 을 연결하는 대체 구문
경고: 이 게시물은 당신을 배고프게 할 것입니다.
주어진:
그룹 대신 개별 행을 여러 개 선택 하고 특정 필드를 연결하고 싶었습니다.
제품 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 | +------------+--------------------+-------+
그런 다음 이러한 강아지를 확인란으로 나열하는 멋진 schmancy ajax가 있습니다.
배고픈 하마 사용자는 13, 15, 16
선택합니다. 오늘 그녀를 위한 디저트는 없다...
찾다:
순수한 mysql을 사용하여 사용자의 주문을 한 줄로 요약하는 방법입니다.
해결책:
IN
절 과 함께 GROUP_CONCAT
사용:
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 | +------------------------------------------------+-------+
elbowlobstercowstandgroup_concat_max_len
매개변수를 설정하여 GROUP_CONCAT
값의 최대 길이를 변경할 수 있습니다.
자세한 내용은 MySQL 문서를 참조하십시오.
pau.morenoGROUP 집계 함수 GROUP_CONCAT 가 있습니다.
Dean Rather제 경우에는 ID 행이 있었고 char로 캐스트해야 했습니다. 그렇지 않으면 결과가 이진 형식으로 인코딩되었습니다.
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
Fedir RYKHTIK다음과 같이 MySQL(5.6.13) 세션 변수와 할당 연산자를 사용합니다.
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
그러면 당신은 얻을 수 있습니다
test1,test11
Shen liang더 복잡한 쿼리가 있었고 외부 쿼리에서 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;
이것이 누군가를 도울 수 있기를 바랍니다.
Alex Bowyer하위 쿼리와 함께 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
은 래핑하지 않고 하위 쿼리 내부에서 사용해야 합니다.
Oleg Abrazhaev이 시도:
DECLARE @Hobbies NVARCHAR(200) = ' ' SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
TL;DR;
set @sql=''; set @result=''; set @separator=' union \r\n'; SELECT @sql:=concat('select ''',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME ,''' as col_name,', INFORMATION_SCHEMA.COLUMNS.CHARACTER_MAXIMUM_LENGTH ,' as def_len ,' , 'MAX(CHAR_LENGTH(',INFORMATION_SCHEMA.COLUMNS.COLUMN_NAME , '))as max_char_len', ' FROM ', INFORMATION_SCHEMA.COLUMNS.TABLE_NAME ) as sql_piece, if(@result:=if(@result='',@sql,concat(@result,@separator,@sql)),'','') as dummy FROM INFORMATION_SCHEMA.COLUMNS WHERE INFORMATION_SCHEMA.COLUMNS.DATA_TYPE like '%char%' and INFORMATION_SCHEMA.COLUMNS.TABLE_SCHEMA='xxx' and INFORMATION_SCHEMA.COLUMNS.TABLE_NAME='yyy'; select @result;
thejustvMySql에서 열을 연결하는 두 가지 방법이 있습니다.
select concat(hobbies) as `Hobbies` from people_hobbies where 1
또는
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
raghavendra늦었지만 "피벗 테이블을 사용하여 여러 MySQL 행을 하나의 필드로 연결"을 검색하는 사람들에게 도움이 될 것입니다. :)
질문:
SELECT pm.id, pm.name, GROUP_CONCAT(c.name) as channel_names FROM payment_methods pm LEFT JOIN payment_methods_channels_pivot pmcp ON pmcp.payment_method_id = pm.id LEFT JOIN channels c ON c.id = pmcp.channel_id GROUP BY pm.id
테이블
payment_methods id | name 1 | PayPal channels id | name 1 | Google 2 | Faceook payment_methods_channels_pivot payment_method_id | channel_id 1 | 1 1 | 2
산출:
Muhammad ShahzadSQL Server에서 string_agg를 사용하여 행 필드 값을 열로 피벗합니다.
select string_agg(field1, ', ') a FROM mytable or select string_agg(field1, ', ') within group (order by field1 dsc) a FROM mytable group by field2
Golden Lion출처 : http:www.stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field