etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2023. 4. 13. 10:23
반응형

질문자 :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 Wiki

MySQL 버전(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 | +------------------------------------------------+-------+

elbowlobstercowstand

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

자세한 내용은 MySQL 문서를 참조하십시오.


pau.moreno

GROUP 집계 함수 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;

thejustv

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

 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 Shahzad

SQL 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

반응형