在一列中选择具有非空值的最新记录

时间:2009-11-16 05:17:40

标签: mysql null

我的表数据看起来像这样

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`

这确实获得了最大内容,但它并没有像我希望的那样只留下加入,只返回200.

帮助?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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指定的所需金额。

答案 2 :(得分:0)

这适合你吗?

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