MySQL ORDER BY CASE Statement Isu: Memesan Berbilang Lajur Cap Waktu
Dalam MySQL, klausa ORDER BY biasanya digunakan untuk mengisih hasil pertanyaan berdasarkan lajur tertentu. Walau bagaimanapun, apabila berurusan dengan berbilang lajur yang perlu dipesan secara bersyarat, cabaran biasa timbul.
Pertimbangkan senario berikut: anda mempunyai jadual pangkalan data dengan struktur seperti itu:
------------------------------------------------------------------- | id_one | id_two | timestamp_one | timestamp_two | ------------------------------------------------------------------- | 27 | 35 | 9:30 | NULL | ------------------------------------------------------------------- | 35 | 27 | NULL | 9:35 | ------------------------------------------------------------------- | 27 | 35 | 9:34 | NULL | ------------------------------------------------------------------- | 35 | 27 | NULL | 9:33 | -------------------------------------------------------------------
Matlamatnya adalah untuk mendapatkan semula keempat-empat baris dan menyusunnya mengikut cap waktu_satu dan cap_dua masa sambil mempertimbangkan syarat tertentu. Khususnya, jika id_one bersamaan dengan 27, baris hendaklah dipesan mengikut timestamp_one; sebaliknya, jika id_two bersamaan dengan 27, ia harus dipesan dengan timestamp_two.
Untuk mencapai ini, banyak percubaan untuk menggunakan pernyataan CASE dalam klausa ORDER BY, seperti:
SELECT * FROM tablename WHERE id_one=27 OR id_two=27 ORDER BY CASE WHEN id_one=27 THEN timestamp_one END DESC, CASE WHEN id_two=27 THEN timestamp_two END DESC
Sementara pendekatan ini menghasilkan susunan yang diingini untuk baris individu, ia gagal untuk menggabungkan dua cap masa lajur ke dalam susunan bersatu, kerana ia tidak dianggap sebagai satu entiti.
Penyelesaian:
Untuk memesan baris seperti yang dikehendaki, kami boleh menggunakan versi yang diubah suai pernyataan CASE dalam klausa ORDER BY:
SELECT id_one, id_two, timestamp_one, timestamp_two FROM tablename WHERE id_one = 27 OR id_two = 27 ORDER BY CASE WHEN id_one=27 THEN timestamp_one WHEN id_two=27 THEN timestamp_two END DESC
Pengubahsuaian ini memperlakukan kedua-dua cap waktu_satu dan timestamp_two sebagai entiti tunggal dan memesan baris dengan sewajarnya. Pernyataan CASE memberikan susunan menurun kepada kedua-dua lajur cap masa berdasarkan syarat yang dinyatakan dalam klausa WHERE, memastikan baris disusun secara keseluruhan.
Atas ialah kandungan terperinci Bagaimana untuk Memesan Baris MySQL Berdasarkan Berbilang Lajur Cap Masa dengan Isih Bersyarat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!