Bagaimana untuk mengumpulkan baris MySQL menggunakan gabungan nilai bukan nol
P粉002023326
P粉002023326 2023-09-06 21:35:03
0
1
575

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粉002023326
P粉002023326

membalas semua(1)
P粉979586159

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!