有个需求不知道怎么写 SQL,特来请教一下

2019-12-11 10:36:28 +08:00
 reidxx

如图表结构,现在需要根据 space_id&user_id 做 group by,然后查询 create_at 最大的那条数据,被难倒了,有没有大佬赐教一下。

6511 次点击
所在节点    MySQL
35 条回复
alpha2016
2019-12-11 10:47:54 +08:00
SELECT space_id,user_id, max(created_at)
FROM table
GROUP BY space_id,user_id
ChoateYao
2019-12-11 10:49:01 +08:00
SELECT ..... ( SELECT .... ORDER BY create_at DESC) AS a GROUP BY space_id, user_id
srx1982
2019-12-11 10:54:13 +08:00
需求有问题吧
reidxx
2019-12-11 10:56:02 +08:00
@alpha2016 #1 这样查出来的只是 create_at 字段为最大,其它字段不是同一条记录
hiths
2019-12-11 10:58:46 +08:00
SELECT
t2.*
FROM
( SELECT space_id, user_id, max( create_at ) AS mx FROM TABLE GROUP BY space_id, user_id ) AS t1
LEFT JOIN TABLE AS t2 ON t2.space_id = t1.space_id
AND t2.user_id = t1.user_id
AND t2.create_at = t1.mx
hiths
2019-12-11 10:59:44 +08:00
不对,时间能 max ()吗。。。。
Cooky
2019-12-11 11:00:40 +08:00
子查询呗
aragakiyuii
2019-12-11 11:01:33 +08:00
什么数据库?
group by 完了 order by create_at desc, 然后取第一条就行了
reidxx
2019-12-11 11:02:06 +08:00
@hiths #5 多谢老铁,这样可以,我看看能否再简化一些
hiths
2019-12-11 11:03:24 +08:00
@reidxx 简化就是写成 where, 不过数据量大就蛋疼了点
lensan
2019-12-11 11:04:18 +08:00
select max (created_at) ,space_id,user_id
from table t
join (
space_id,user_id from group by space_id,user_id
) t2 on t.space_id=t2.space_id and t.user_id =t2.user_id
zhesheng
2019-12-11 11:05:04 +08:00
select * from ( select a.*,row_number() over (partition by a.space_id,a.user_id order by a.create_at desc) rn from table_name a ) where rn =1
reidxx
2019-12-11 11:05:18 +08:00
@hiths #6 可以的,你上面那条 sql 暂时来看满足需求,我试试增加点数据验证一下。

@aragakiyuii #8 mysql
lff0305
2019-12-11 11:08:40 +08:00
```
select * from table as t
where (select count(distinct(e1.created_at)) from table as t1 where t1.space_id= e.space_id and t1.user_id
= t.user_id and t1.created_at > t.created_at) < 1;
```

没试验,大概这个意思,效率不高
andj4cn
2019-12-11 11:09:45 +08:00
create_at 也需要 group by 吧,先 根据 space_id, user_id, create_at 进行 group by,然后 select * from () order by create_at desc limit 1
reidxx
2019-12-11 11:11:31 +08:00
@andj4cn #15 每条记录的 create_at 基本都不一样,加入 group by 的话就相当于查全部数据了,再 order by limit 1 就只返回一条数据了
dofine
2019-12-11 11:14:30 +08:00
row_number() over (partition by space_id, user_id order by create_at desc)
== 抱歉忘记好像 mysql 不支持。
fox0001
2019-12-11 11:20:16 +08:00
如果是 SQL server,我会用 row_number。具体如下

select space_id, user_i
from(
select space_id, user_id, row_number()over(partition by space_id, user_id order by create_at desc) num
from .....
)a
where number=1
xuanbg
2019-12-11 11:33:39 +08:00
如果你的数据只有 space_id、user_id、create_at 的话,1 楼就能满足你的要求。如果不止这 3 个字段的话,1 楼的 sql 当做一个子查询,然后用这个结果去 join 原表,on 条件就是这 3 个字段全匹配。
kiracyan
2019-12-11 11:36:37 +08:00
这样? 其实没太看懂需求
select * from t1
where not exists(select 1 from t2 where t1.user_id=t2.user_id and t1.space_id=t2.space_id and t1.create_at <t2.create_at )

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627876

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX