请教一个 sql in 查询

2018-03-19 14:13:02 +08:00
 meisei81

有表 a:id, order_col1, order_col2

原本的查询是单个 id 去查询 select * from a where id=:id order by order_col1 desc, order_col2 desc limit 1

现在想把上面的语句改成批量 id 的 in 查询,类型于 select * from a where id in (:idList) 这样,但问题是如何保证根据每个 id 查到符合 order by ... limit 1 的数据。

谢谢。

1557 次点击
所在节点    问与答
5 条回复
sun1991
2018-03-19 16:54:46 +08:00
随便写了一下, 大概是这样的:
```
with t as(
select id, order_col1, order_col2, row_number() over (partition by id order by order_col1 desc, order_col2 desc) as seq
from a
where id in (:idList)
)
select id, order_col1, order_col2
from t
where seq = 1;
```

不知道你用的什么数据库, row_number 只有 Oracle 和 SqlServer 有, MySQL 好像不支持.
meisei81
2018-03-19 20:48:22 +08:00
@sun1991 感谢回复。忘记说了。用的是 mysql5.6
gbin
2018-03-19 20:55:39 +08:00
分组行不?
select * from a where id in (:idList) group by id order by order_col1 desc, order_col2 desc limit 1
panpanpan
2018-03-19 21:01:17 +08:00
搜一下 Mysql 开窗函数。楼上的方法不错不过 mysql 不能用
meisei81
2018-03-20 09:49:20 +08:00
@gbin 分组后的输出应该是不正确的

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

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

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

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

© 2021 V2EX