programing

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

copyandpastes 2022. 10. 2. 22:44
반응형

여러 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파라미터를 지정합니다.

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

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;

CONCAT_GROUP()

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

반응형