Rumah > Soal Jawab > teks badan
Bagaimana untuk menggabungkan/menggabungkan baris dengan memilih nilai terkinibukan nol setiap lajur dalam hasil terkumpul?
id | Pengguna | Buah-buahan | Nombor | Masa penciptaan |
---|---|---|---|---|
1 | Jane | Epal | kosong | 2022-01-01 |
2 | John | Tembikai | 32 | 2022-01-02 |
3 | John | kosong | 72 | 2022-01-03 |
4 | John | Pear | kosong | 2022-01-04 |
Kaedah berikut tidak akan berkesan:
SELECT user, COALESCE(fruit) as fruit, COALESCE(number) as number, FROM mytable GROUP BY user ORDER BY created_at DESC
Saya harap hasilnya adalah:
Jane Apple Null John Pear 72
Masalahnya ialah fungsi COALESCE() tidak berfungsi dengan set nilai, tetapi hanya dengan senarai.
Banyak topik yang disebut menggunakan MIN() atau MAX() dan bukannya COALESCE() sebagai penyelesaian. Tetapi ini tidak menyelesaikan masalah kerana saya memerlukan nilai baharu untuk menimpa nilai lama, bukan nilai terendah atau tertinggi.
P粉9795861592023-09-07 20:00:18
Memandangkan COALESCE()
bukan fungsi agregat tetapi hanya boleh berfungsi dengan senarai nilai yang diberikan, saya menemui penyelesaian @jsowa dalam siaran ini: Mengapa "COALESCE" tidak berfungsi dengan "GROUP BY"?
Kami boleh menggunakan SUBSTRING_INDEX(GROUP_CONCAT())
sebaliknya SUBSTRING_INDEX(GROUP_CONCAT())
来替代COALESCE()
.
Sila beri perhatian khusus kepada klausa ORDER BY dalam GROUP_CONCAT(). Kelemahannya ialah pembatas mestilah watak tidak digunakan dalam sebarang nilai.
SELECT user, SUBSTRING_INDEX(GROUP_CONCAT(fruit ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS fruit, SUBSTRING_INDEX(GROUP_CONCAT(number ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS number, FROM mytable GROUP BY user;
Kembalikan hasil
Jane Apple Null John Pear 72