Rumah >pangkalan data >tutorial mysql >Bagaimana untuk mengumpulkan e-mel mengikut penghantar dan mendapatkan subjek dan cap masa terkini dalam MySQL?
Pengumpulan E-mel MySQL: Memastikan Subjek dan Cap Masa Terkini Tepat
Mendapatkan semula dan mengumpulkan data e-mel oleh pengirim dalam MySQL memerlukan pertimbangan yang teliti untuk menjamin subjek dan cap masa mencerminkan e-mel yang terkini. Klausa standard GROUP BY
dan ORDER BY
sahaja boleh menghasilkan keputusan yang tidak konsisten.
Masalah dengan Asas GROUP BY
Pertanyaan
Pendekatan biasa, tetapi cacat, ialah:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Pertanyaan ini cuba mengumpulkan mengikut pengirim, tetapi subject
dan timestamp
yang dipilih bukanlah yang paling terbaharu secara konsisten.
Penyelesaian Subkueri
Kaedah yang lebih dipercayai melibatkan subkueri untuk mengutamakan pesanan sebelum mengumpulkan:
<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 membalikkan susunan operasi. Pertanyaan dalaman diisih mengikut cap masa dan kumpulan pertanyaan luar mengikut pengirim, memastikan data e-mel terbaharu dipilih.
Pertimbangan Penting dan Keserasian MySQL 5.7
Menggunakan lajur bukan agregat dalam senarai SELECT
dengan GROUP BY
ialah gelagat SQL bukan standard. Pengendalian MySQL terhadap perkara ini tidak dapat diramalkan, selalunya mengembalikan nilai daripada baris sewenang-wenang dalam setiap kumpulan.
Memandangkan MySQL 5.7.5, ONLY_FULL_GROUP_BY
ialah lalai, membawa kepada ralat jika lajur tidak teragregat disertakan tanpa fungsi pengagregatan yang betul.
Amalan Terbaik untuk MySQL 5.7 dan Kemudian
Untuk keserasian dan kejelasan optimum, terutamanya dalam MySQL 5.7 dan versi yang lebih baru, gunakan ANY_VALUE()
:
<code class="language-sql">SELECT `timestamp`, `fromEmail`, ANY_VALUE(`subject`) AS `subject` FROM `incomingEmails` GROUP BY LOWER(`fromEmail`) ORDER BY `timestamp` DESC</code>
Ini menyatakan dengan jelas bahawa sebarang nilai daripada lajur subject
boleh diterima untuk setiap kumpulan, memastikan pertanyaan berfungsi dengan betul dan mengelakkan kekaburan. Cap masa terbaharu akan dikekalkan kerana klausa ORDER BY
.
Atas ialah kandungan terperinci Bagaimana untuk mengumpulkan e-mel mengikut penghantar dan mendapatkan subjek dan cap masa terkini dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!