여러 MySQL 행을 하나의 필드에 연결할 수 있습니까?
사용.MySQL
다음과 같은 작업을 수행할 수 있습니다.
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
마이 출력:
shopping
fishing
coding
대신 한 줄, 한 줄만 주세요.
예상 출력:
shopping, fishing, coding
그 이유는 여러 테이블에서 여러 값을 선택하고 있고 모든 조인 후에 원하는 것보다 훨씬 많은 행이 있기 때문입니다.
MySQL Doc에서 기능을 찾아봤는데CONCAT
또는CONCAT_WS
함수는 결과 세트를 받아들입니다.
여기 이 방법 아는 사람 있어?
다음을 사용할 수 있습니다.
SELECT person_id,
GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
루드비히가 그의 코멘트에서 언급했듯이, 당신은 다음과 같이 추가할 수 있다.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 |
+------------+--------------------+-------+
그리고 당신은 이 강아지들을 체크박스로 분류하는 화려한 아약스를 가지고 있다.
hungry-hippo 사용자는13, 15, 16
오늘은 디저트는 안 돼요
검색:
사용자의 주문을 순수한 mysql로 한 줄로 요약하는 방법입니다.
솔루션:
사용하다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 |
+------------------------------------------------+
보너스 솔루션:
합계 가격도 원하시면, 다음 항목을 추가해 주세요.
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 |
+------------------------------------------------+-------+
의 최대 길이를 변경할 수 있습니다.GROUP_CONCAT
값을 설정함으로써 값을 매기다group_concat_max_len
파라미터를 지정합니다.
GROUP_CONCAT라는 GROUP Aggregate 함수가 있습니다.
제 경우 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
좀 더 복잡한 질문이 있는데, 그 질문으로 인해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;
이게 누군가에게 도움이 되길 바라.
을 보고 있는 , ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 사용 방법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
서브쿼리 내에서 사용해야 하며, 래핑해서는 안 됩니다.
이것을 시험해 보세요.
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;
MySql의 열을 연결하는 두 가지 방법이 있습니다.
select concat(hobbies) as `Hobbies` from people_hobbies where 1
또는
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1
늦었지만 "피벗 테이블을 사용하여 여러 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
출력:
여기서 저의 의도는 group_concat() 함수를 사용하지 않고 문자열 연결을 적용하는 것이었습니다.
Set @concatHobbies = '';
SELECT TRIM(LEADING ', ' FROM T.hobbies ) FROM
(
select
Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies
from peoples_hobbies
)T
Order by Id DESC
LIMIT 1
여기서
select
Id, @concatHobbies := concat_ws(', ',@concatHobbies,hobbies) as hobbies
from peoples_hobbies
돌아온다
Id hobbies
1 , shopping
2 , shopping, fishing
3 , shopping, fishing, coding
이제 우리의 예상 결과는 3위입니다.그래서 마지막 행은 다음과 같이 하고 있습니다.
Order by Id DESC
LIMIT 1
그 후 문자열에서 첫 번째 ', '도 삭제합니다.
TRIM(LEADING ', ' FROM T.hobbies )
sql 서버에서 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
이 경우 또 다른 흥미로운 예는 다음과 같습니다.
입니다.people_hobbies
-
DESCRIBE people_hobbies;
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| ppl_id | int unsigned | YES | MUL | NULL | |
| name | varchar(200) | YES | | NULL | |
| hby_id | int unsigned | YES | MUL | NULL | |
| hobbies | varchar(50) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
테이블은 다음과 같이 채워집니다.
SELECT * FROM people_hobbies;
+----+--------+-----------------+--------+-----------+
| id | ppl_id | name | hby_id | hobbies |
+----+--------+-----------------+--------+-----------+
| 1 | 1 | Shriya Jain | 1 | reading |
| 2 | 4 | Shirley Setia | 4 | coding |
| 3 | 2 | Varsha Tripathi | 7 | gardening |
| 4 | 3 | Diya Ghosh | 2 | fishing |
| 5 | 4 | Shirley Setia | 3 | gaming |
| 6 | 1 | Shriya Jain | 6 | cycling |
| 7 | 2 | Varsha Tripathi | 1 | reading |
| 8 | 3 | Diya Ghosh | 5 | shopping |
| 9 | 3 | Diya Ghosh | 4 | coding |
| 10 | 4 | Shirley Setia | 1 | reading |
| 11 | 1 | Shriya Jain | 4 | coding |
| 12 | 1 | Shriya Jain | 3 | gaming |
| 13 | 4 | Shirley Setia | 2 | fishing |
| 14 | 4 | Shirley Setia | 7 | gardening |
| 15 | 2 | Varsha Tripathi | 3 | gaming |
| 16 | 2 | Varsha Tripathi | 2 | fishing |
| 17 | 1 | Shriya Jain | 5 | shopping |
| 18 | 1 | Shriya Jain | 7 | gardening |
| 19 | 3 | Diya Ghosh | 1 | reading |
| 20 | 4 | Shirley Setia | 5 | shopping |
+----+--------+-----------------+--------+-----------+
그럼 표 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.hobby_list
행으로 .
CREATE TABLE hobby_list AS
-> SELECT ppl_id, name,
-> GROUP_CONCAT(hobbies ORDER BY hby_id SEPARATOR "\n")
-> AS hobbies
-> FROM people_hobbies
-> GROUP BY ppl_id
-> ORDER BY ppl_id;
SELECT * FROM hobby_list;
GROUP_CONCAT 사용:
SELECT GROUP_CONCAT(hobbies) FROM peoples_hobbies WHERE person_id = 5;
언급URL : https://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field
'programing' 카테고리의 다른 글
MySQL에서 외부 키 제약 조건을 사용하는 이유 (0) | 2022.10.02 |
---|---|
VueJS-컴포넌트 재렌더 구현에 도움이 필요함 (0) | 2022.10.02 |
임의의 베이스에서 정수를 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2022.10.02 |
java: 지정된 초수 후에 함수를 실행합니다. (0) | 2022.10.02 |
따옴표와 괄호가 있는 경우와 없는 경우의 set Timeout의 차이 (0) | 2022.10.02 |