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.
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())
sebaliknyaSUBSTRING_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.
Kembalikan hasil