문제

사용 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top