Pertanyaan Bisakah saya menggabungkan beberapa baris MySQL ke dalam satu bidang?


Menggunakan MySQL, Saya bisa melakukan sesuatu seperti:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

Keluaran saya:

shopping
fishing
coding

tetapi saya hanya ingin 1 baris, 1 col:

Output yang diharapkan:

shopping, fishing, coding

Alasannya adalah bahwa saya memilih beberapa nilai dari beberapa tabel, dan setelah semua bergabung saya punya lebih banyak baris daripada yang saya inginkan.

Saya sudah mencari fungsi MySQL Doc dan itu tidak terlihat seperti CONCAT atau CONCAT_WS fungsi menerima set hasil, jadi adakah yang tahu cara melakukan ini?


945
2017-11-10 02:34


asal


Jawaban:


Kamu dapat memakai GROUP_CONCAT:

SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Seperti yang Ludwig nyatakan komentarnya, Anda dapat menambahkan DISTINCT operator untuk menghindari duplikat:

SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Seperti Jan menyatakan dalam komentar mereka, Anda juga bisa mengurutkan nilai-nilai sebelum menggunakannya ORDER BY:

SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies GROUP BY person_id

Seperti yang Dag nyatakan komentarnya, ada batas 1024 byte pada hasil. Untuk mengatasi ini, jalankan query ini sebelum permintaan Anda:

SET group_concat_max_len = 2048

Tentu saja, Anda bisa berubah 2048 sesuai dengan kebutuhan anda. Untuk menghitung dan menetapkan nilainya:

SET group_concat_max_len = CAST(
    (SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
    FROM peoples_hobbies GROUP BY person_id)
    AS UNSIGNED
)

1380
2017-11-10 02:48



Silahkan lihat GROUP_CONCAT jika versi MySQL Anda (4.1) mendukungnya. Lihat dokumentasi untuk lebih jelasnya.

Itu akan terlihat seperti:

  SELECT GROUP_CONCAT(hobbies SEPARATOR ', ') 
  FROM peoples_hobbies 
  WHERE person_id = 5 
  GROUP BY 'all';

77
2017-09-23 20:26



Sintaks alternatif untuk menggabungkan banyak, baris individu

PERINGATAN: Posting ini akan membuat Anda lapar.

Diberikan:

Saya menemukan diri saya ingin pilih beberapa, baris individu—bukan dari grup — dan gabungkan pada bidang tertentu.

Katakanlah Anda memiliki tabel id produk beserta nama dan harganya:

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

Kemudian Anda memiliki beberapa ajax mewah-schmancy yang mencantumkan anak-anak anjing ini sebagai kotak centang.

Pengguna lapar-hippo Anda memilih 13, 15, 16. Tidak ada makanan penutup untuknya hari ini ...

Menemukan:

Cara untuk meringkas pesanan pengguna Anda dalam satu baris, dengan mysql murni.

Larutan:

Menggunakan GROUP_CONCAT dengan itu IN ayat:

mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);

Output mana:

+------------------------------------------------+
| order_summary                                  |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+

Solusi Bonus:

Jika Anda menginginkan harga total juga, masukkan 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 |
+------------------------------------------------+-------+

PS: Permintaan maaf jika Anda tidak memiliki Masuk dan keluar dekat...


52
2018-04-08 11:32



Anda dapat mengubah panjang maksimal dari GROUP_CONCAT nilai dengan mengatur group_concat_max_len parameter.

Lihat detail di Dokumentasi MySQL.


33
2017-11-10 02:48



Ada fungsi GROUP Aggregate, GROUP_CONCAT.


23
2018-06-10 09:24



Dalam kasus saya, saya memiliki deretan Id, dan itu perlu untuk membuangnya ke char, jika tidak, hasilnya dikodekan ke dalam format biner:

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table

18
2017-09-27 18:47



Gunakan MySQL (5.6.13) sesi variabel dan tugas operator seperti berikut ini

SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;

maka Anda bisa mendapatkannya

test1,test11

12
2018-04-29 16:35



Saya memiliki pertanyaan yang lebih rumit, dan menemukan bahwa saya harus menggunakannya GROUP_CONCAT dalam permintaan luar untuk membuatnya berfungsi:

Permintaan Asli:

SELECT DISTINCT userID 
FROM event GROUP BY userID 
HAVING count(distinct(cohort))=2);

Terindodode:

SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ') 
FROM (SELECT DISTINCT userID FROM event 
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;

Semoga ini bisa membantu seseorang.


9
2018-02-26 15:25