2009-11-16 44 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 
相关问题