Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mendapatkan Kembali Lajur Bukan Agregat dengan betul dengan MAX() MySQL dan GROUP BY?

Bagaimanakah Saya Boleh Mendapatkan Kembali Lajur Bukan Agregat dengan betul dengan MAX() MySQL dan GROUP BY?

Linda Hamilton
Linda Hamiltonasal
2024-12-30 21:27:09915semak imbas

How Can I Correctly Retrieve Non-Aggregated Columns with MySQL's MAX() and GROUP BY?

Mengumpul dan Mengagregatkan dengan MAX() dalam MySQL

Dalam MySQL, fungsi MAX() boleh digunakan bersama dengan GROUP BY klausa untuk mengagregat data dan memilih nilai maksimum untuk lajur tertentu dalam setiap kumpulan. Walau bagaimanapun, jika lajur sasaran tidak unik dalam kumpulan, memilih lajur tidak teragregat yang sepadan mungkin menghasilkan hasil yang tidak dijangka.

Untuk menggambarkan isu ini, mari kita periksa pertanyaan SQL berikut:

SELECT MAX(timestamp), rid, pid
FROM theTable
GROUP BY rid;

Hasil pertanyaan ini mungkin tidak sejajar dengan hasil yang diingini, kerana lajur pid yang dipilih mungkin tidak sepadan dengan cap masa dengan maksimum nilai.

Untuk mendapatkan hasil yang betul, kita perlu mengubah suai pertanyaan untuk mengenal pasti baris dengan cap masa maksimum dalam setiap kumpulan dan kemudian sertakan baris ini dengan jadual asal untuk mendapatkan pid yang sepadan.

Pertanyaan SQL yang diubah suai berikut mencapai ini:

SELECT test.pid, test.cost, test.timestamp, test.rid
FROM theTable AS test
INNER JOIN
    (SELECT rid, MAX(timestamp) AS ts
    FROM theTable
    GROUP BY rid) AS maxt
ON (test.rid = maxt.rid AND test.timestamp = maxt.ts);

Pertanyaan ini mula-mula mengenal pasti cap masa maksimum untuk setiap penyingkiran menggunakan subquery, dan kemudian bergabung dengan jadual asal. Syarat cantum memastikan bahawa baris yang dipilih adalah baris yang mempunyai cap masa maksimum dalam setiap kumpulan rid.

Hasilnya, output yang diingini diperoleh:

pid cost timestamp rid
5 345 2011-04-14 01:06:06 1
3 4455 2011-04-14 01:05:41 2
7 5435 2011-04-14 01:14:14 3

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendapatkan Kembali Lajur Bukan Agregat dengan betul dengan MAX() MySQL dan GROUP BY?. 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