여러 MySQL 행을 한 필드에 연결할 수 있습니까?
-
07-07-2019 - |
문제
사용 MySQL
, 나는 다음과 같은 일을 할 수 있습니다.
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
내 출력 :
shopping
fishing
coding
그러나 대신 나는 단지 1 행, 1 col을 원한다 :
예상 출력 :
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
);
다른 팁
살펴보십시오 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 |
+------------+--------------------+-------+
그런 다음이 강아지를 체크 박스로 나열하는 멋진 찰과 같은 Ajax가 있습니다.
배고픈 히포 사용자가 선택합니다 13, 15, 16
. 오늘 그녀를위한 디저트가 없습니다 ...
찾다:
순수한 MySQL과 함께 사용자의 주문을 한 줄로 요약하는 방법.
해결책:
사용 GROUP_CONCAT
이랑 그만큼 IN
절:
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 Documantation.
그룹 집계 기능이 있습니다. Group_Concat.
제 경우에는 한 줄의 ID가 있었는데, 그것을 숯으로 캐스팅하는 것이 필요했습니다. 그렇지 않으면 결과는 이진 형식으로 인코딩되었습니다.
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;
이것이 누군가를 도울 수 있기를 바랍니다.
이 시도:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
여기에서 사용하는 방법을 찾는 사람을 위해 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
서브 쿼리 내부에서 감싸지 않아야합니다.
MySQL에서 열을 연결하는 두 가지 방법이 있습니다
select concat(hobbies) as `Hobbies` from people_hobbies where 1
또는
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1