V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nyse
V2EX  ›  数据库

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

  •  
  •   nyse · 2019-10-11 18:02:17 +08:00 · 2692 次点击
    这是一个创建于 1873 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设

    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

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

    11 条回复    2019-10-12 07:04:34 +08:00
    eason1874
        1
    eason1874  
       2019-10-11 18:12:24 +08:00
    直接参考 WordPress 分类关系表设计
    aragakiyuii
        2
    aragakiyuii  
       2019-10-11 18:15:32 +08:00 via Android
    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
        3
    ipiao  
       2019-10-11 18:16:39 +08:00
    建议写 2 条 sql,拒绝 join
    Doldrums
        4
    Doldrums  
       2019-10-11 18:17:59 +08:00
    对 B 表 ROW_NUMBER() over(partition...)排序之后 leftjoin 限制 B.rowNum=1
    bumz
        5
    bumz  
       2019-10-11 19:06:00 +08:00 via iPhone
    select a.*, b.content from a, b where a.id = b.aid limit 1;

    没测
    想时间倒序就加 order by
    bumz
        6
    bumz  
       2019-10-11 19:07:46 +08:00 via iPhone
    @bumz 看错,忽略
    QiuSe
        7
    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
        8
    Caballarii  
       2019-10-11 20:13:56 +08:00
    建议分开写 sql,多不了几条,A 表多了就分页查
    wangyzj
        9
    wangyzj  
       2019-10-11 20:14:34 +08:00
    content 不应该是属于 a 表才对么
    nyse
        10
    nyse  
    OP
       2019-10-11 20:58:33 +08:00
    @wangyzj #9 不是,A 表一个条目对应 B 表多条,但只要选取 B 表其中一条
    zjsxwc
        11
    zjsxwc  
       2019-10-12 07:04:34 +08:00 via Android
    两次 sql 呗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3527 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:45 · PVG 08:45 · LAX 16:45 · JFK 19:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.