Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Memilih E-mel Terkini setiap Pengirim dengan Cekap dalam MySQL?
Mengoptimumkan Pertanyaan MySQL untuk Pendapatan E-mel Terkini
Klausa GROUP BY
dan ORDER BY
MySQL ialah alat yang berkuasa untuk organisasi data, tetapi memilih e-mel terbaharu bagi setiap penghantar dengan cekap memerlukan pertimbangan yang teliti. Pendekatan naif mungkin menghasilkan hasil yang salah.
Sebagai contoh, pertanyaan ini cuba mengumpulkan e-mel mengikut penghantar dan memesan mengikut cap masa:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Masalahnya ialah timestamp
dan subject
yang dikembalikan mungkin tidak menggambarkan e-mel terbaharu untuk setiap pengirim.
Penyelesaian yang lebih mantap melibatkan subkueri untuk terlebih dahulu memesan data mengikut cap masa dan kemudian mengumpulkan mengikut penghantar:
<code class="language-sql">SELECT * FROM ( SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` ORDER BY `timestamp` DESC ) AS tmp_table GROUP BY LOWER(`fromEmail`)</code>
Ini mencipta jadual sementara (tmp_table
) yang disusun mengikut cap masa, memastikan operasi pengumpulan memilih e-mel terbaharu bagi setiap pengirim.
Walau bagaimanapun, kaedah ini bergantung pada gelagat MySQL untuk memilih nilai arbitrari untuk lajur bukan agregat dalam klausa GROUP BY
. Ini adalah SQL bukan standard dan boleh membawa kepada hasil yang tidak dapat diramalkan. MySQL 5.7.5 memperkenalkan ONLY_FULL_GROUP_BY
secara lalai, menjadikan pendekatan ini bermasalah.
Untuk menangani perkara ini, kita boleh menggunakan ANY_VALUE()
(diperkenalkan dalam MySQL 5.7), yang secara eksplisit membenarkan memilih sebarang nilai daripada kumpulan untuk lajur tidak teragregat:
<code class="language-sql">SELECT ANY_VALUE(`timestamp`) AS recent_timestamp, ANY_VALUE(`fromEmail`) AS sender_email, ANY_VALUE(`subject`) AS subject FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY recent_timestamp DESC</code>
Pertanyaan ini menyediakan cara yang lebih dipercayai dan mematuhi standard untuk mendapatkan semula e-mel terbaharu untuk setiap pengirim dalam pangkalan data MySQL anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memilih E-mel Terkini setiap Pengirim dengan Cekap dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!