쉼표로 구분 된 목록으로 MySQL 결과


129

다음과 같은 쿼리를 실행해야합니다.

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

그러나 하위 열이 데이터 열 대신 쉼표로 구분 된 목록을 반환하도록하고 싶습니다. 이것이 가능합니까? 그렇다면 가능합니까?

답변:


250

GROUP_CONCAT 를 사용 하여 수행 할 수 있습니다 ( 예 :

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;

10
또한 PHPMyAdmin을 사용하고 있고 쉼표로 구분 된 목록을 페이지에 출력하려면을 사용 GROUP_CONCAT(CAST(s.name AS CHAR))하거나 그렇지 않으면 전체적으로 유용 하지 않은 것을 반환합니다 [BLOB - 20 Bytes].
devios1

3
의도는 좋으며 MySQL은 이것을 허용하지만 GROUP BY를 사용할 때는 (일반적으로) 조심해야합니다. 선택 목록의 항목은 GROUP BY 절의 컨텍스트에서 유효한 집계 여야합니다. 이 경우 p.name은 엄격하지 않습니다. SQL 표준을 준수하는 모든 데이터베이스는이를 오류로 취급합니다. 이 경우 선택 목록에서 MAX (p.name)을 사용하거나 GROUP BY 절에 p.name을 추가하십시오. Paul은 아마도 기본 또는 고유 키를 나타내는 p.id를 의미하므로 p.name을 GROUP BY 절에 추가해도 최종 결과에는 영향을 미치지 않습니다.
Jon Armstrong-Xgc


매우 감사합니다! 당신은 저를 많이 도와주었습니다!
André Agostinho '12

11

사용하는 대신 group concat()그냥 사용할 수 있습니다concat()

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

편집은 mySQL에서만 작동합니다. Oracle concat은 두 개의 인수 만 허용합니다. 오라클에서는 table1의 foobar로 select col1 || ','|| col2 || ','|| col3과 같은 것을 사용할 수 있습니다. SQL Server에서는 파이프 대신 +를 사용합니다.


2
이것은 GROUP BY 사례에서는 작동하지 않지만 GROUP_CONCAT ()는 단일 열의 내용을 연결합니다.
Aram Paronikyan

5

이제 나는이 상황을 만났고 더 흥미로운 기능을 발견했습니다 GROUP_CONCAT. 이러한 세부 사항이 여러분의 흥미를 유발할 수 있기를 바랍니다.

간단한 GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

결과:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

DISTINCT가 포함 된 GROUP_CONCAT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

결과:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

DISTINCT 및 ORDER BY가 포함 된 GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;

결과:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

DISTINCT 및 SEPARATOR가있는 GROUP_CONCAT

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;

결과:

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

GROUP_CONCAT 및 조합 열

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;

결과:

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

GROUP_CONCAT 및 그룹화 된 결과 다음은 사용하기 전의 결과라고 가정합니다GROUP_CONCAT

+------------------------+--------------------------+
| ArtistName             | AlbumName                |
+------------------------+--------------------------+
| Iron Maiden            | Powerslave               |
| AC/DC                  | Powerage                 |
| Jim Reeves             | Singing Down the Lane    |
| Devin Townsend         | Ziltoid the Omniscient   |
| Devin Townsend         | Casualties of Cool       |
| Devin Townsend         | Epicloud                 |
| Iron Maiden            | Somewhere in Time        |
| Iron Maiden            | Piece of Mind            |
| Iron Maiden            | Killers                  |
| Iron Maiden            | No Prayer for the Dying  |
| The Script             | No Sound Without Silence |
| Buddy Rich             | Big Swing Face           |
| Michael Learns to Rock | Blue Night               |
| Michael Learns to Rock | Eternity                 |
| Michael Learns to Rock | Scandinavia              |
| Tom Jones              | Long Lost Suitcase       |
| Tom Jones              | Praise and Blame         |
| Tom Jones              | Along Came Jones         |
| Allan Holdsworth       | All Night Wrong          |
| Allan Holdsworth       | The Sixteen Men of Tain  |
+------------------------+--------------------------+
USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

결과:

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

3

제 경우에는 휴대 전화 번호가 고유 한 사람의 모든 계좌 번호를 연결해야합니다. 그래서 나는 그것을 달성하기 위해 다음 쿼리를 사용했습니다.

SELECT GROUP_CONCAT(AccountsNo) as Accounts FROM `tblaccounts` GROUP BY MobileNumber

쿼리 결과는 다음과 같습니다.

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.