Menggunakan MySQL
, aku bisa melakukan sesuatu seperti:
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
My Output:
shopping
fishing
coding
tapi bukan aku hanya ingin 1 row, col 1:
Output Yang Diharapkan:
shopping, fishing, coding
Alasannya adalah bahwa saya'm memilih beberapa nilai dari beberapa tabel, dan setelah semua bergabung dengan I've punya lebih banyak baris dari saya'd suka.
I've mencari fungsi di MySQL Doc dan't terlihat seperti CONCAT
atau CONCAT_WS
fungsi menerima hasil set, jadi tidak ada orang di sini tahu bagaimana melakukan ini?
Anda dapat menggunakan [GROUP_CONCAT
][group-concat]:
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Sebagai Ludwig dinyatakan dalam komentarnya, anda dapat menambahkan BERBEDA
operator untuk menghindari duplikat:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Sebagai Jan dinyatakan dalam komentar mereka, anda juga dapat mengurutkan nilai-nilai sebelum meledak itu menggunakan ORDER BY
:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Sebagai Dag dinyatakan dalam komentarnya, ada 1024 byte batas pada hasil. Untuk memecahkan masalah ini, jalankan query ini sebelum permintaan anda:
SET group_concat_max_len = 2048;
Tentu saja, anda dapat mengubah 2048
sesuai dengan kebutuhan anda. Untuk menghitung dan menetapkan nilai:
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies
GROUP BY person_id)
AS UNSIGNED
);
Lihat di GROUP_CONCAT
jika versi MySQL anda (4.1) mendukung itu. Lihat dokumentasi untuk lebih jelasnya.
Itu akan terlihat seperti ini:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
PERINGATAN: posting Ini akan membuat anda lapar.
Aku mendapati diriku ingin pilih beberapa, masing-masing baris—bukan kelompok, dan menggabungkannya pada bidang tertentu.
Let's katakanlah anda memiliki sebuah meja id produk dan nama-nama mereka dan harga:
+------------+--------------------+-------+
| 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 |
+------------+--------------------+-------+
Maka anda memiliki beberapa mewah-schmancy ajax yang berisi anak anjing ini sebagai kotak centang.
Anda lapar-hippo user memilih 13, 15, 16
. Tidak ada penutup untuk hari ini...
Cara untuk meringkas pengguna anda's perintah dalam satu baris, dengan murni mysql.
Gunakan GROUP_CONCAT
dengan DALAM
klausul:
mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);
Yang output:
+------------------------------------------------+
| order_summary |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+
Jika anda ingin total harga juga, melemparkan [JUMLAH ' ()
] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_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: Maaf jika anda don't memiliki In-N-Out terdekat...
Anda dapat mengubah panjang max GROUP_CONCAT
nilai dengan menetapkan group_concat_max_len
parameter.
Lihat rincian di MySQL documantation.
Aku punya lebih rumit query, dan menemukan bahwa saya harus menggunakan GROUP_CONCAT
di luar query untuk mendapatkan itu untuk bekerja:
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;
Semoga ini bisa membantu seseorang.
Untuk seseorang melihat di sini bagaimana menggunakan GROUP_CONCAT
dengan subquery - posting ini contoh
PILIH aku.*, (SELECT GROUP_CONCAT(userid) DARI favorit f DIMANA f.itemid = aku.id) SEBAGAI idlist DARI barang-barang saya Di MANA saya.id = $suatuid
Jadi GROUP_CONCAT
harus digunakan dalam subquery, tidak pembungkus itu.