例如
article
文章表
字段 | 注释 |
---|---|
id | 文章主键 |
title | 文章标题 |
comment
评论表
字段 | 注释 |
---|---|
id | 评论主键 |
article_id | 文章主键 |
content | 评论内容 |
现查询文章列表 , 要求查询 10 篇文章,每篇文章附上最新的 3 条评论.
我现在的做法是查询出 10 篇文章.然后在代码里循环查询每篇文章的最新 3 条评论.
总计 1+10 次查询....
请教有什么更好的办法,减少查询次数吗?
子查询?或者再 mysql 中做函数 /存储过程?
1
dqzcwxb 2021-09-22 14:56:52 +08:00 1
循环查询改为 in 查询后在代码中 join
|
2
westoy 2021-09-22 15:00:30 +08:00 1
不要搞复杂
你现在这种其实 SQL Cache 命中率更高, 也更容易在后期做 k-v cache......... |
3
Bigglesworth 2021-09-22 15:00:49 +08:00 1
减少次数,就 join 起来查?
|
4
zjttfs OP |
6
zilongzixue 2021-09-22 15:17:51 +08:00 1
mybatis 一对多查询
|
7
lin07hui 2021-09-22 15:23:04 +08:00 1
orm 吧
|
8
hingbong 2021-09-22 15:33:28 +08:00 1
```
val sqlStep = articles.map { article -> select * from comment where article_id = article1.id limit 3 }.reduce { left, right -> left.union(right) } sqlStep.fetch() ``` 我日常用 kotlin + jooq,这个需求大概就是这个思路查询 |
9
hingbong 2021-09-22 15:34:15 +08:00
```
val sqlStep = articles.map { article -> select * from comment where article_id = article.id limit 3 }.reduce { left, right -> left.union(right) } sqlStep.fetch() ``` 手误 |
10
tangtj 2021-09-22 15:35:56 +08:00 1
我觉得你的逻辑是 ok 的。1 + n 查询没啥问题,评论的查询也很方便上缓存。
|
11
dqzcwxb 2021-09-22 15:50:25 +08:00
@zjttfs #4 那可能没法用 in 查询,只能串行改并行提升效率了.建议使用 Completablefuture 这样也方便做 cache
|
12
wolfie 2021-09-22 15:52:04 +08:00 1
select from comment where id = 1 order by id desc limit 3
union all select from comment where id = 2 order by id desc limit 3 语法可能错误,用子查询包一下 |
14
zjttfs OP |
16
zzfer 2021-09-22 16:00:43 +08:00
mybatis 一对多标签 collection 可以限制查三条。但这样其实效果和你循环查询一样,只不过在一次连接查完。限制十条数据还行,查的多了速度一样很慢
|