it-swarm-id.com

Bagaimana SELECT oleh MAX (tanggal)?

Ini adalah struktur tabel

CREATE TABLE `reports` (
  `report_id` int(11) NOT NULL auto_increment,
  `computer_id` int(11) NOT NULL default '0',
  `date_entered` datetime NOT NULL default '1970-01-01 00:00:00',
  `total_seconds` int(11) NOT NULL default '0',
  `iphone_id` int(11) default '0',
  PRIMARY KEY  (`report_id`),
  KEY `computer_id` (`computer_id`),
  KEY `iphone_id` (`iphone_id`)
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1

Saya memerlukan pernyataan SELECT yang akan mencantumkan report_id per computer_id dari date_entered yang dimasukkan terakhir, dan saya tidak tahu bagaimana melakukannya. Adakah yang bisa mengarahkan saya ke arah yang benar? Terima kasih sebelumnya.

19
poetter747

Ini harus dilakukan:

SELECT report_id, computer_id, date_entered
FROM reports AS a
WHERE date_entered = (
    SELECT MAX(date_entered)
    FROM reports AS b
    WHERE a.report_id = b.report_id
      AND a.computer_id = b.computer_id
)
38
bhamby

Apakah Anda hanya ingin menampilkan tanggal terakhir yang dimasukkan, atau untuk memesan dengan memulai dengan tanggal terakhir yang dimasukkan?

SELECT report_id, computer_id, date_entered
FROM reports
GROUP BY computer_id
ORDER BY date_entered DESC
-- LIMIT 1 -- uncomment to only show the last date.
12
Genzume

Sesuai dengan ini: https://bugs.mysql.com/bug.php?id=54784 casting sebagai char harus melakukan trik:

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR))
FROM reports
GROUP BY report_id, computer_id
3
Frane Poljak

Solusi tetapi solusi kerja

Hanya jika ID peningkatan otomatis, Anda dapat mencari id maksimum dan bukan tanggal maks . Jadi, dengan ID Anda dapat menemukan semua bidang lainnya.

select *
from table
where id IN ( 
              select max(id)
              from table
              group by #MY_FIELD#
              )
0

Ini adalah pertanyaan yang sangat lama tetapi saya datang ke sini karena masalah yang sama, jadi saya meninggalkan ini di sini untuk membantu orang lain.

Saya mencoba mengoptimalkan kueri karena butuh lebih dari 5 menit untuk meminta DB karena jumlah data. Permintaan saya mirip dengan permintaan jawaban yang diterima. Komentar Pablo mendorong saya ke arah yang benar dan permintaan 5 menit saya menjadi 0,016 detik. Jadi untuk membantu orang lain yang memiliki waktu kueri yang sangat lama coba gunakan subquery tidak berkorelasi .

Contoh untuk OP adalah:

SELECT 
    a.report_id, 
    a.computer_id, 
    a.date_entered
FROM reports AS a
    JOIN (
        SELECT report_id, computer_id, MAX(date_entered) as max_date_entered
        FROM reports
        GROUP BY report_id, computer_id
    ) as b
WHERE a.report_id = b.report_id
    AND a.computer_id = b.computer_id
    AND a.date_entered = b.max_date_entered

Terima kasih Pablo untuk komentarnya. Anda menyelamatkan saya waktu besar!

0
Jeremy