2009-11-16 99 views
0

我有一個看起來像這樣選擇帶有非空值的最新記錄在一列

id | keyword | count | date 
1 | ipod | 200 | 2009-08-02 
2 | ipod | 250 | 2009-09-01 
3 | ipod | 150 | 2009-09-04 
4 | ipod | NULL | 2009-09-07 

現在表中的數據是什麼,我以後越來越具有最新的日期,但有一個行的數不是空數。在這種情況下,第3行與數150)

SELECT `keyword`, `count` , max(`date`) 
FROM `keywords` 
WHERE keyword = "ipod" 
AND `count` IS NOT NULL 
GROUP BY keyword 

這返回正確的日期,但不正確的計數(返回200)。我也試過對自己做一個左連接。

SELECT `t1`.`keyword` , `t2`.`count` , max(`t1`.`id`) 
FROM `keywords` `t1` 
LEFT JOIN `keywords` `t2` ON `t1`.`id` = `t2`.`id` 
WHERE `t1`.`keyword` = 'ipod' 
AND `t1`.`count` IS NOT NULL 
GROUP BY `t1`.`keyword` 

這的確得到了最大ID,但它並沒有離開,加入到像我希望,只返回200

幫助?

回答

1
SELECT `keyword`, `count` , `date` 
FROM `keywords` 
WHERE keyword = "ipod" 
AND `count` IS NOT NULL 
order by date desc 
limit 1 
+0

您對 – jitter 2009-11-16 05:21:07

+0

哎呀打我,就這麼簡單......只是試圖去幻想。謝謝! – Wizzard 2009-11-16 05:29:20

1

肯定有一個更好的辦法,但在平均時間:

SELECT `count` 
FROM `keywords` 
WHERE keyword = "ipod" 
AND `count` IS NOT NULL 
ORDER BY `date` DESC 
LIMIT 1 

應適合您的需求。請注意,LIMIT不是可移植的SQL,因此它只適用於MySQL。 ORDER BY子句是強制數據庫按日期排序所必需的。

當我提到應該有更好的方法時,這僅僅是因爲LIMIT子句的工作原理,即:數據庫必須獲取符合查詢條件的所有行,然後將結果集簡單地截斷爲所需數量由LIMIT指定。

0

這是否對你的工作:

SELECT `keyword`, `count`, `date` 
FROM `keywords` 
WHERE keyword = "ipod" 
AND `count` IS NOT NULL 
ORDER BY DATE DESC 
LIMIT 1