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

发布于 2024-08-10 22:00:22 字数 751 浏览 3 评论 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。

有帮助吗?

I have table data which looks like this

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

Now what I am after is getting the count of the row which has the newest date but has a not null count. In which case row 3 with count 150.)

eg

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

This returned the right date but not the right count (returned 200). I also tried doing a left join on it's self.

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`

And this did get the max id but it didn't left-join onto that like I hoped and returned only 200.

Help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

走走停停 2024-08-17 22:00:22
SELECT `keyword`, `count` , `date`
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
order by date desc 
limit 1
SELECT `keyword`, `count` , `date`
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
order by date desc 
limit 1
风渺 2024-08-17 22:00:22

我确信有更好的方法,但同时:

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 指定的所需数量。

I'm sure there's a better way, but in the mean time:

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

Should fit your requirements. Note that LIMIT is not portable SQL, so it will only work for MySQL. The ORDER BY clause is necessary to force the database to sort by, well, date.

When I mentioned that there should be a better way, that's merely because of the way the LIMIT clause works, which is: The database has to fetch ALL rows that meet the query criteria, then simply truncates the result set to the desired amount specified by LIMIT.

情痴 2024-08-17 22:00:22

这对你有用吗:

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

Does this work for you:

SELECT `keyword`, `count`, `date` 
FROM `keywords` 
WHERE keyword = "ipod"
AND `count` IS NOT NULL 
ORDER BY DATE DESC
LIMIT 1
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文