Hasil MySQL sebagai daftar yang dipisahkan koma


129

Saya perlu menjalankan kueri seperti:

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

Tapi saya ingin sub-pilih untuk mengembalikan daftar yang dipisahkan koma, bukan kolom data. Apakah ini bahkan mungkin, dan jika demikian, bagaimana?

Jawaban:


250

Anda dapat menggunakan GROUP_CONCAT untuk melakukan itu, misalnya sesuatu seperti

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
Juga, catat dengan cepat bahwa jika Anda menggunakan PHPMyAdmin dan ingin menampilkan daftar yang dibatasi koma ke halaman tersebut, gunakan GROUP_CONCAT(CAST(s.name AS CHAR))atau yang lain itu hanya akan mengembalikan sesuatu yang sama sekali tidak berguna seperti [BLOB - 20 Bytes].
devios1

3
Maksudnya baik-baik saja dan MySQL akan mengizinkan ini, tetapi berhati-hatilah (umumnya) dengan penggunaan GROUP BY Anda. Item dalam daftar pilih harus agregat yang valid dalam konteks klausa GROUP BY. Dalam hal ini, p.name tidak sepenuhnya valid. Setiap basis data yang memenuhi standar SQL akan menganggap ini sebagai kesalahan. Untuk kasus ini, gunakan MAX (nama p) dalam daftar pilih atau tambahkan nama p ke klausa GROUP BY. Karena Paul mungkin berarti p.id untuk mewakili kunci utama atau unik, menambahkan nama p. ke klausa GROUP BY tidak akan berdampak pada hasil akhir.
Jon Armstrong - Xgc

Perhatikan Anda mungkin harus mengatur panjang maks untuk sesi per stackoverflow.com/questions/2567000/…
sobelito

Terima kasih banyak! Anda banyak membantu saya!
André Agostinho

11

Alih-alih menggunakan group concat()Anda bisa menggunakan hanyaconcat()

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

sunting ini hanya berfungsi di mySQL; Oracle concat hanya menerima dua argumen. Di oracle Anda dapat menggunakan sesuatu seperti select col1 || ',' || col2 || ',' || col3 sebagai foobar dari table1; di sql server Anda akan menggunakan + bukan pipa.


2
Ini seharusnya tidak berfungsi dalam GROUP BY case, sedangkan GROUP_CONCAT () akan menyatukan konten kolom tunggal
Aram Paronikyan

5

Sekarang hanya saya yang menemukan situasi ini dan menemukan beberapa fitur yang lebih menarik GROUP_CONCAT. Saya harap detail ini akan membuat Anda merasa menarik.

GROUP_CONCAT sederhana

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Hasil:

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

GROUP_CONCAT dengan DISTINCT

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

Hasil:

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

GROUP_CONCAT dengan DISTINCT dan ORDER BY

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

Hasil:

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

GROUP_CONCAT dengan DISTINCT dan SEPARATOR

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

Hasil:

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

GROUP_CONCAT dan Menggabungkan Kolom

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

Hasil:

+------------------------------------------------------------------------------------+
| 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 dan Hasil yang Dikelompokkan Asumsikan bahwa yang berikut adalah hasil sebelum digunakanGROUP_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;

Hasil:

+------------------------+----------------------------------------------------------------------------+
| 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

Dalam kasus saya, saya harus menggabungkan semua nomor akun orang yang nomor ponselnya unik. Jadi saya telah menggunakan permintaan berikut untuk mencapainya.

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

Hasil Permintaan di bawah ini:

Accounts
93348001,97530801,93348001,97530801
89663501
62630701
6227895144840002
60070021
60070020
60070019
60070018
60070017
60070016
60070015
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.