V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
frozenway
V2EX  ›  问与答

如何用一条 SQL 语句同时查询这三张数据表?数据表如下

  •  
  •   frozenway · 2021-04-01 16:31:08 +08:00 · 1857 次点击
    这是一个创建于 1323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    ####表 a aid|name|cid|did|sex|xdate --|:--:|:--:|:--:|:--:|--: 1|john|1,3|1,2,3|未知|2021-01-02

    ####表 c cid|cname --|--: 1|小花 2|阿狸 3|大菊

    ####表 d did|dname --|--: 1|大黄 2|小黑 3|小灰

    需要一次性查出表 a aid=1 的详细数据,表 a 的 cid 对应表 c 的 cid,表 a 的 did 对应表 d 的 did

    QQ 截图 20210401163208.jpg

    第 1 条附言  ·  2021-04-01 17:26:34 +08:00
    为了提高效率,本想一条语句查的,确实查不了,只能分开了
    20 条回复    2021-04-02 19:53:56 +08:00
    frozenway
        1
    frozenway  
    OP
       2021-04-01 16:36:21 +08:00
    ```
    SELECT a.*, c.*, d.* FROM a LEFT JOIN c ON c.cid IN a.cid LEFT JOIN d ON d.did IN a.did WHERE a.aid=1
    ```
    这是我想到的语句,但是报错了
    hulalalla
        2
    hulalalla  
       2021-04-01 16:45:46 +08:00
    FIND_IN_SET
    eason1874
        3
    eason1874  
       2021-04-01 16:51:42 +08:00
    LEFT JOIN c
    ON FIND_IN_SET(c.cid, a.cid)
    c6h6benzene
        4
    c6h6benzene  
       2021-04-01 16:52:18 +08:00 via iPhone
    这表设计就…一言难尽。

    IN 的运算对象是集合,你需要想办法把 a 表中的 cid 和 did 拆开,例如 SQL Server 的 STRING_SPLIT 。
    shenjinpeng
        5
    shenjinpeng  
       2021-04-01 16:55:48 +08:00
    建议分开查 ... , 联表查出来格式也不对
    lance6716
        6
    lance6716  
       2021-04-01 16:58:18 +08:00   ❤️ 1
    第一次见第一范式都不符合的……
    x86
        7
    x86  
       2021-04-01 16:59:33 +08:00
    这 MySQL 表跟受委屈了...
    yeqizhang
        8
    yeqizhang  
       2021-04-01 16:59:43 +08:00
    分开查没毛病, 如果是管理系统的列表展示, 循环多查几次而已。

    这不会是面试题吧?
    customsshen
        9
    customsshen  
       2021-04-01 17:01:44 +08:00 via Android
    select a.*,c.* from a left join c on a.cid= c.cid where a.aid=1 union ( select a.* , d.* from a left join d on a.cid= d.cid where a.aid=1 )
    yeqizhang
        10
    yeqizhang  
       2021-04-01 17:09:53 +08:00
    @customsshen 兄弟,你看错了,a.cid 是逗号分隔的多个 id
    customsshen
        11
    customsshen  
       2021-04-01 17:20:30 +08:00 via Android
    @yeqizhang 哈哈,好家伙,直接放弃吧。
    dqzcwxb
        12
    dqzcwxb  
       2021-04-01 17:34:10 +08:00   ❤️ 1
    放一条 sql 查恰恰是效率最低的方案之一
    shyrock
        13
    shyrock  
       2021-04-01 18:20:06 +08:00
    拒绝回答这种问题,建议赶紧把表 1 拆开。把设计这种表的人拉去挂电线杆。
    pendulum
        14
    pendulum  
       2021-04-01 19:17:00 +08:00
    表 a 的设计真是。。
    TomVista
        15
    TomVista  
       2021-04-01 19:42:14 +08:00
    祭天吧
    tcfenix
        16
    tcfenix  
       2021-04-01 19:49:02 +08:00
    如果你想 cid 跟 did 用来做外键的话你就应该搞个 relation 表, 建立 aid cid 与 did 的多对多对多的关系

    到时候用起来就很简单


    而不是用逗号分隔.....你这设计的都能进教科书了.....
    KouShuiYu
        17
    KouShuiYu  
       2021-04-01 22:25:08 +08:00
    postgresql 是支持的,可以吧 cid,did 转成数组关联查询,
    vynkicc
        18
    vynkicc  
       2021-04-02 11:03:42 +08:00
    解决开表 1 的人
    AlkTTT
        19
    AlkTTT  
       2021-04-02 11:27:45 +08:00
    这 A 表降 san 值,快跑!
    SjwNo1
        20
    SjwNo1  
       2021-04-02 19:53:56 +08:00 via iPhone
    为啥要一条 sql
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:53 · PVG 05:53 · LAX 13:53 · JFK 16:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.