Rumah >pangkalan data >tutorial mysql >Bagaimana untuk mengumpulkan e-mel mengikut penghantar dan mendapatkan subjek dan cap masa terkini dalam MySQL?

Bagaimana untuk mengumpulkan e-mel mengikut penghantar dan mendapatkan subjek dan cap masa terkini dalam MySQL?

Barbara Streisand
Barbara Streisandasal
2025-01-12 14:01:43645semak imbas

How to reliably group emails by sender and retrieve the most recent subject and timestamp in 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn