这周技术部出了一个数据库题给大家做,自己做这个题也补习了一些知识。

#group_concat 多行的列结果合并到一行 , 结合 group by userid 达到 。
#concat_ws 可以指定符号的字符串(列合并)连接,本例中用 - 连接 省 市 区 ,多个地区之间用默认的逗号。
#find_in_set 用于代替in查询 , in查询在子查询表达式中,如果in的其中一个数据为null,不管其它条件是否有数据,整个表达式的结果就是null,在此使用find_in_set替代。
#子查询中或通过substring处理后的值,in还有可能只返回第一个而非全部。

select companyid as 公司编号 ,userid as 用户编号 ,group_concat( (select concat_ws('-', (select group_concat(b.areaname separator '-') from area b where  find_in_set (b.areaid,a.arrparentid)),a.areaname) from area a where a.areaid = u_a.areaid)  ) as 负责区域 from user_area u_a where u_a.companyid = 52 group by userid

运行效果

图片1.jpg

原题目

/*
    三个表:
    user表:用户表,(公司id,会员id,会员名)(公司id和会员id共同为主键)
    companyid   userid        name
    1            1132        张三
    2            1133        李四
    2            1196        王五
    2            1197        赵六
    
    user_area表:用户地区表,(会员id,公司id,负责地区id,父级地区id)(会员id,公司id,地区id 共同为主键)
    userid        companyid    areaid        parentareaid
    1132        1            3            3
    1132        1            36            4
    1132        1            168            4
    1135        4            1            1
    1135        4            2            2
    1135        4            3            3
    
    area表:地区信息表(地区表只有两级结构,即省和市/区),(地区id,地区名,父级地区id,所有父级地区id,是否有下级地区,所有下级地区id)(areaid为主键)
    areaid    areaname    parentid    arrparentid        haschild    arrchild
    1        浙江                0            0                1            1,37,53,54,55,56,57,58,59,60,62,63
    2        北京                0            0                1            2,146,147,150,151,152,153,154,155,156
    3        上海                0            0                1            183,185,186,187,188,189,190,191,192
    36        湖州市            1            0,1                1            36,47,48,49,50,51
    37        杭州市            1            0,1                1            37,53,54,55,56,57,58,59,60,62,63,64,65,66
    
    要求根据companyid 获取各个会员所负责的省级地区,(所有数据不是真实数据,三个表可以根据字段名看出关联关系)
    
    所得结果例如:
    companyid    userid    areaname
    2            1133    
    2            1196    浙江,上海,山东
    2            1197    
    
*/
    
/*
修改一条数据 3187 得到区
UPDATE  `test`.`user_area` SET  `areaid` =  '3187' WHERE  `user_area`.`userid` =1330 AND  `user_area`.`companyid` =52 AND  `user_area`.`areaid` =3183; 
*/