gpt4 book ai didi

sql - 如何根据列的最大值+分组从MySQL中选择行

转载 作者:IT老高 更新时间:2023-10-29 00:07:12 26 4
gpt4 key购买 nike

我有一个表格,其中包含(比方说)用户查看特定网页的所有时间。用户当然可以多次查看一个页面,因此用户和页面可以有多个条目,如下所示:

nid     time    user  page_id
25 8000 4 467
24 7000 1 482
23 6000 1 484
22 5000 1 482
21 4000 5 467
20 3000 4 467

我想做一个查询,返回与每个用户查看的每个页面相对应的行,如果用户多次查看一个页面,我会得到与最新 View 相对应的行(即TIME的最大值)。因此,我应该得到这个:

nid     time    user  page_id
25 8000 4 467
24 7000 1 482
23 6000 1 484
21 4000 5 467

我们丢失了第 22 行,因为用户 1 稍后查看了第 482 页,而我们丢失了第 20 行,因为用户 4 稍后查看了第 467 页。

我几乎想通了,但我不能完全破解它,同时也说服自己我得到的结果通常是正确的,而不仅仅是我的测试用例的意外。我一直在 GROUP BY 或 DISTINCT 查询和嵌入式查询之间来回切换,然后我的大脑爆炸了。有什么建议么?谢谢!

最佳答案

如果你需要完整的行,你可以使用这个:

SELECT fullTable.nid as nid, 
recent.time as time,
fullTable.user as user,
fullTable.page_id as page_id
FROM TableName fullTable
INNER JOIN (SELECT MAX(t1.time) as time, t1.user, t1.page_id
FROM TableName t1
GROUP BY user, page_id) recent
ON recent.time = fullTable.time AND
recent.user = fullTable.user AND
recent.page_id = fullTable.page_id
ORDER BY time DESC

如果您要求在“group by”子句之外的列,mysql 可以为该组内的该列返回任何值。所以如果组内的所有值都不一样,就是你的情况,不能直接包含在select子句中,需要使用join。

您可以在 the reference 上阅读有关 MySQL 上未分组列的更多信息。

如果不需要nid字段,可以用这个其他的:

SELECT MAX(time) as time, user, page_id 
FROM TableName
GROUP BY user, page_id
ORDER BY time DESC

关于sql - 如何根据列的最大值+分组从MySQL中选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4831491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com