Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mendapatkan Kembali Lajur Bukan Agregat dengan betul dengan MAX() MySQL dan 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!