V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qwa123
V2EX  ›  程序员

小白求大佬帮我看下这条 sql 怎么写

  •  
  •   qwa123 · 2019-02-16 18:48:44 +08:00 · 2786 次点击
    这是一个创建于 2099 天前的主题,其中的信息可能已经有所发展或是发生改变。
    15 条回复    2019-02-18 00:28:51 +08:00
    qwa123
        1
    qwa123  
    OP
       2019-02-16 19:05:32 +08:00
    有人吗...
    yuankui
        2
    yuankui  
       2019-02-16 19:29:51 +08:00   ❤️ 1
    group by + group_concat.

    兄弟,听我一句劝,伸手党在 V2EX 是混不下去的,好好打一下基础,提一点对大家有价值的问题。
    keyfunc
        3
    keyfunc  
       2019-02-16 20:12:18 +08:00
    作业自己做系列
    azh7138m
        4
    azh7138m  
       2019-02-16 20:26:29 +08:00 via Android
    楼主微博名字好评
    2L 正解
    Cbdy
        5
    Cbdy  
       2019-02-16 20:29:14 +08:00 via Android
    MySQL 不要用驼峰
    GuangXiN
        6
    GuangXiN  
       2019-02-16 20:30:59 +08:00 via Android
    用驼峰也没啥问题
    newlife
        8
    newlife  
       2019-02-16 23:48:58 +08:00
    select "batchId",
    case when type::integer=1 then array_agg("bizId") else null end as "uid" ,
    case when type::integer=2 then array_agg("bizId") else null end as "fid"
    from V2EX group by "batchId",type;

    result:

    "batchId","uid","fid"
    "1", "['uid1', 'uid2']",NULL
    "3", NULL, "['fid3']"
    "1", NULL, "['fid1', 'fid2']"
    "2", "['uid3']", NULL

    这个和楼主的要求还不符,求解答,,,如何合并第一和第三项?我用的 postgre
    easylee
        9
    easylee  
       2019-02-17 00:00:15 +08:00   ❤️ 2
    @yuankui 楼主发帖态度挺诚恳的,应该是实在不会才发帖询问的。

    好好的论坛,大家为何不对新手友善点。
    newlife
        10
    newlife  
       2019-02-17 00:31:43 +08:00
    select "batchId",
    array_remove(array_agg(case when type::integer=1 then "bizId" end ),NULL)as "uid" ,
    array_remove(array_agg(case when type::integer=2 then "bizId" end),NULL )as "fid"
    from V2EX group by "batchId";

    result:

    "3" "{}" "{fid3}"
    "2" "{uid3}" "{}"
    "1" "{uid1,uid2}" "{fid1,fid2}"

    这次对了,还有别的写法么?
    GuangXiN
        11
    GuangXiN  
       2019-02-17 16:33:59 +08:00
    @Cbdy 你贴第一个是给 MySQL 写 test cases 的时候需遵循的规范,第二个是该 blog 作者所在团队的规范。自己开发使用 MySQL 的时候,遵守自己团队规范即可,MySQL 本身可以支持驼峰命名的表名和字段名,innodb 存储引擎也不会把表名当文件名保存,不会触发大小写敏感的问题。
    Cbdy
        12
    Cbdy  
       2019-02-17 16:47:29 +08:00
    @GuangXiN
    这不是技术上的,这是规约上的。在实践中,MySQL 甚至可以用中文作为列名——但很少有人这么做
    我问过很多 DBA,他们建议不要使用驼峰。出于“最小惊讶原则”,选用主流的规约是好的。所以我给出这个建议
    chenqh
        13
    chenqh  
       2019-02-17 18:38:57 +08:00
    工作几年 sql 只会简单的 sql 了
    GuangXiN
        14
    GuangXiN  
       2019-02-17 19:59:43 +08:00
    @Cbdy 这个看你们怎么用 MySQL,我厂有几个库是给产品和运营用的,里面有大量中文字段名的表和视图
    pupilGradeSix
        15
    pupilGradeSix  
       2019-02-18 00:28:51 +08:00
    可能对于专业的来说太简单了,但我作为一个前端,你这个 sql 着实让我感兴趣了啊。研究了好一会
    ```
    SELECT batchId,
    group_concat( CASE WHEN type = 1 THEN
    bizId ELSE null END) as "uid",
    group_concat( CASE WHEN type = 2 THEN
    bizId ELSE null END) as "typeid"
    FROM test
    GROUP BY batchId;

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:40 · PVG 10:40 · LAX 18:40 · JFK 21:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.