2011-10-20 23 views
13

Bu benim date_entered girilen son gelen computer_id başına report_id listeleyecek bir SELECT ifadeye ihtiyacım tablo yapısıMAX (tarih) ile nasıl seçilir?

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 

, ve ben nasıl bunu yapmak için hiçbir ipucu var. Beni doğru yöne yönlendiren var mı? Önceden Thx.

cevap

28

Bu yapmalıyım:

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 
) 
+2

Almost ile birlikte bulunan tüm rapor_id'lerinin ilk report_id öğesiydi. "A.report_id = b.report_id" 'i dışarıda bıraktım ve bu hile yaptı. Teşekkür ederiz – poetter747

+2

Bu biraz verimsiz çünkü çok fazla alt sorgu oluşturuyorsunuz. Bunun yerine, ilişkisiz bir alt sorgu kullanmayı deneyin. https://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html – Pablo

+0

Pablo doğru. Filtreleme, bir alt sorguya katılarak daha önce yapılabilir, böylece performanstan tasarruf edilir. – twicejr

11

Yalnızca son tarihin geçtiği yeri göstermek mi yoksa girilen son_tarihi ile başlayarak sipariş vermek mi istiyorsunuz?

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. 
+2

, ben yanlış olsun REPORT_ID. Ben WHERE computer_id = 30 ile ifadeyi kontrol ettim. Sonuç, en son date_entered – poetter747

3

accordig buna: https://bugs.mysql.com/bug.php?id=54784 casting karakter hile yapmak gerekir olarak: id Bunu yaptığınızda

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR)) 
FROM reports 
GROUP BY report_id, computer_id 
+0

Bu, size en fazla tarih alacaktır, ancak aynı satırdaki diğer değerleri içermeyecektir. – Vincent

0
SELECT report_id, computer_id, date_entered 
FROM reports 
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1 
) 
+1

Sınırlı, anında yardım sağlayabilen bu kod snippet'i için teşekkür ederiz. Doğru bir açıklama [// meta.stackexchange.com/q/114762] uzun vadeli değerini * göstererek * neden * bu sorunun iyi bir çözümü olduğunu ve gelecekteki okuyuculara daha yararlı olmasını diğer, benzer sorular. Lütfen yaptığınız varsayımlar dahil, bazı açıklamalar eklemek için cevabınızı [düzenleyin]. –