SQL: 一对多的关系,如何获取其中一条作为一个字段的值?

2019-10-11 18:02:17 +08:00
 nyse

假设

A 表字段:id, name, update_time

B 表字段:id, aid, content, update_time

其中,B 表的 aid 对应 A 表的 id,且会有多条 aid 相同,即 A 表的一条数据对应 B 表多条数据。

在查询 A 表的时候 select * from A ,同时要关联读取 B 表中一条对应 aid 的 content 字段,这一条数据可能是根据更新时间倒序的最后一条。

总之,最后想要的查询结果含有 A.* B.content

这种需求怎么实现比较合理?

2499 次点击
所在节点    数据库
11 条回复
eason1874
2019-10-11 18:12:24 +08:00
直接参考 WordPress 分类关系表设计
aragakiyuii
2019-10-11 18:15:32 +08:00
select a.*, b.content from A a, (select aid, content, row_number() over (order by update_time desc partition by aid ) as rn from B where rn = 1) b where a.id = b.aid

oracle 没测试过,如果想要 A 表全部记录得左连接
ipiao
2019-10-11 18:16:39 +08:00
建议写 2 条 sql,拒绝 join
Doldrums
2019-10-11 18:17:59 +08:00
对 B 表 ROW_NUMBER() over(partition...)排序之后 leftjoin 限制 B.rowNum=1
bumz
2019-10-11 19:06:00 +08:00
select a.*, b.content from a, b where a.id = b.aid limit 1;

没测
想时间倒序就加 order by
bumz
2019-10-11 19:07:46 +08:00
@bumz 看错,忽略
QiuSe
2019-10-11 20:09:57 +08:00
SELECT a.id,a.`name`,a.update_time, ( SELECT b.content FROM b GROUP BY b.aid HAVING MAX(b.update_time) and b.aid =1) as bcontent
FROM a
INNER JOIN b
WHERE b.aid = a.id = 1
不知道对不对?
Caballarii
2019-10-11 20:13:56 +08:00
建议分开写 sql,多不了几条,A 表多了就分页查
wangyzj
2019-10-11 20:14:34 +08:00
content 不应该是属于 a 表才对么
nyse
2019-10-11 20:58:33 +08:00
@wangyzj #9 不是,A 表一个条目对应 B 表多条,但只要选取 B 表其中一条
zjsxwc
2019-10-12 07:04:34 +08:00
两次 sql 呗

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

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

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

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

© 2021 V2EX