Jim*_*ler 14 mysql sql group-by distinct
当用户查看特定网页时,我有一个包含(让我们说)的表格.用户当然可以多次查看页面,因此用户和页面可以有多个条目,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
我想做一个查询,返回与每个用户查看的每个页面对应的行.如果用户多次查看页面,我会获得与最近视图相对应的行(即最大值时间).因此,我应该得到这个:
nid time user page_id
25 8000 4 467
24 7000 1 482
23 6000 1 484
21 4000 5 467
Run Code Online (Sandbox Code Playgroud)
我们丢失了第22行,因为用户1稍后查看了第482页,我们丢失了第20行,因为用户4稍后查看了第467页.
我几乎已经想到了这一点,但我不能完全破解它,同时也说服自己,我得到的结果通常是正确的,而不仅仅是我的测试用例的意外.我一直在GROUP BY或DISTINCT查询和嵌入式查询之间来回切换,然后我的大脑爆炸了.有什么建议?谢谢!
Bor*_*rja 20
如果您需要整行,可以使用:
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
Run Code Online (Sandbox Code Playgroud)
如果要求"group by"子句之外的列,mysql可以在此组中返回此列的任何值.因此,如果组内的所有值都不相同,那么您就不能直接将它包含在select子句中,您需要使用连接.
您可以在参考上阅读有关MySQL上未分组列的更多信息
如果您不需要nid字段,则可以使用另一个:
SELECT MAX(time) as time, user, page_id
FROM TableName
GROUP BY user, page_id
ORDER BY time DESC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28766 次 |
| 最近记录: |