• 这道 Mysql 的解题思想,值得学习!


    题目:

    (1). 前置条件:

    有如下数据集A,表查询结果如下图所示,设置该表为表:test_province_city。

    (2). 题目要求:

    数据集A,按照省市区分别显示为3列,为省一级时,后面没有下一级,则后两列为空,为市一级,后面没有下一级,则后一列为空。

    预期结果:

    解题思路:

    (1). 第1个union all的子查询,查询出省一级的信息

    查询结果如下:

    1. NAME_1   NAME_2  NAME_3
    2. 浙江   
    3. 安徽 

    (2). 第2个union all的子查询,查询出市二级的信息

    查询结果如下:

    1. NAME_1  NAME_2  NAME_3
    2. 浙江     杭州 
    3. 浙江     宁波 
    4. 安徽     合肥 
    5. 安徽     宣城 

    (3). 第3个union all的子查询,查询出区三级的信息

    查询结果如下:

    1. NAME_1   NAME_2   NAME_3
    2. 浙江      杭州      滨江
    3. 浙江      杭州      富阳
    4. 浙江      杭州      萧山

    (4). 最后按照省、市NAME进行正序排列

    查询结果如预期结果所示

    解题方式一:

    适用于不用创建物理表的情况下

    使用数据集A,B,C,D,E,F替代物理表:test_province_city,直接复制以下 Mysql 语句,可以在 Mysql 或 Hive sql 环境直接运行,得到以上预期结果数据。

    1. select NAME_1,
    2.     NAME_2,
    3.     NAME_3 
    4.  from (select NAME AS NAME_1,
    5.      '' AS NAME_2,
    6.      '' AS NAME_3
    7.    from (  select 1 ID,10000 CODE,'浙江' NAME,0 PARENTCODE
    8.      union all
    9.      select 2 ID,20000 CODE,'安徽' NAME,0 PARENTCODE
    10.      union all
    11.      select 3 ID,11000 CODE,'杭州' NAME,10000 PARENTCODE
    12.      union all
    13.      select 4 ID,12000 CODE,'宁波' NAME,10000 PARENTCODE
    14.      union all
    15.      select 5 ID,21000 CODE,'合肥' NAME,20000 PARENTCODE
    16.      union all
    17.      select 6 ID,22000 CODE,'宣城' NAME,20000 PARENTCODE
    18.      union all
    19.      select 7 ID,11100 CODE,'萧山' NAME,11000 PARENTCODE
    20.      union all
    21.      select 8 ID,11300 CODE,'滨江' NAME,11000 PARENTCODE
    22.      union all
    23.      select 9 ID,11300 CODE,'富阳' NAME,11000 PARENTCODE
    24.     )A where PARENTCODE=0
    25.     union all
    26.     select B.NAME AS NAME_1,
    27.         C.NAME AS NAME_2,
    28.         '' AS NAME_3
    29.      from (  select 1 ID,10000 CODE,'浙江' NAME,0 PARENTCODE
    30.        union all
    31.        select 2 ID,20000 CODE,'安徽' NAME,0 PARENTCODE
    32.        union all
    33.        select 3 ID,11000 CODE,'杭州' NAME,10000 PARENTCODE
    34.        union all
    35.        select 4 ID,12000 CODE,'宁波' NAME,10000 PARENTCODE
    36.        union all
    37.        select 5 ID,21000 CODE,'合肥' NAME,20000 PARENTCODE
    38.        union all
    39.        select 6 ID,22000 CODE,'宣城' NAME,20000 PARENTCODE
    40.        union all
    41.        select 7 ID,11100 CODE,'萧山' NAME,11000 PARENTCODE
    42.        union all
    43.        select 8 ID,11300 CODE,'滨江' NAME,11000 PARENTCODE
    44.        union all
    45.        select 9 ID,11300 CODE,'富阳' NAME,11000 PARENTCODE
    46.       )B join 
    47.       (   select 1 ID,10000 CODE,'浙江' NAME,0 PARENTCODE
    48.        union all
    49.        select 2 ID,20000 CODE,'安徽' NAME,0 PARENTCODE
    50.        union all
    51.        select 3 ID,11000 CODE,'杭州' NAME,10000 PARENTCODE
    52.        union all
    53.        select 4 ID,12000 CODE,'宁波' NAME,10000 PARENTCODE
    54.        union all
    55.        select 5 ID,21000 CODE,'合肥' NAME,20000 PARENTCODE
    56.        union all
    57.        select 6 ID,22000 CODE,'宣城' NAME,20000 PARENTCODE
    58.        union all
    59.        select 7 ID,11100 CODE,'萧山' NAME,11000 PARENTCODE
    60.        union all
    61.        select 8 ID,11300 CODE,'滨江' NAME,11000 PARENTCODE
    62.        union all
    63.        select 9 ID,11300 CODE,'富阳' NAME,11000 PARENTCODE
    64.       )C on B.CODE = C.PARENTCODE and B.PARENTCODE=0
    65.     union all
    66.     select D.NAME AS NAME_1,
    67.         E.NAME AS NAME_2, 
    68.         F.NAME AS NAME_3
    69.      from (  select 1 ID,10000 CODE,'浙江' NAME,0 PARENTCODE
    70.        union all
    71.        select 2 ID,20000 CODE,'安徽' NAME,0 PARENTCODE
    72.        union all
    73.        select 3 ID,11000 CODE,'杭州' NAME,10000 PARENTCODE
    74.        union all
    75.        select 4 ID,12000 CODE,'宁波' NAME,10000 PARENTCODE
    76.        union all
    77.        select 5 ID,21000 CODE,'合肥' NAME,20000 PARENTCODE
    78.        union all
    79.        select 6 ID,22000 CODE,'宣城' NAME,20000 PARENTCODE
    80.        union all
    81.        select 7 ID,11100 CODE,'萧山' NAME,11000 PARENTCODE
    82.        union all
    83.        select 8 ID,11300 CODE,'滨江' NAME,11000 PARENTCODE
    84.        union all
    85.        select 9 ID,11300 CODE,'富阳' NAME,11000 PARENTCODE
    86.       )D JOIN 
    87.       (   select 1 ID,10000 CODE,'浙江' NAME,0 PARENTCODE
    88.        union all
    89.        select 2 ID,20000 CODE,'安徽' NAME,0 PARENTCODE
    90.        union all
    91.        select 3 ID,11000 CODE,'杭州' NAME,10000 PARENTCODE
    92.        union all
    93.        select 4 ID,12000 CODE,'宁波' NAME,10000 PARENTCODE
    94.        union all
    95.        select 5 ID,21000 CODE,'合肥' NAME,20000 PARENTCODE
    96.        union all
    97.        select 6 ID,22000 CODE,'宣城' NAME,20000 PARENTCODE
    98.        union all
    99.        select 7 ID,11100 CODE,'萧山' NAME,11000 PARENTCODE
    100.        union all
    101.        select 8 ID,11300 CODE,'滨江' NAME,11000 PARENTCODE
    102.        union all
    103.        select 9 ID,11300 CODE,'富阳' NAME,11000 PARENTCODE
    104.       )E ON D.CODE=E.PARENTCODE AND D.PARENTCODE=0
    105.       JOIN (  select 1 ID,10000 CODE,'浙江' NAME,0 PARENTCODE
    106.         union all
    107.         select 2 ID,20000 CODE,'安徽' NAME,0 PARENTCODE
    108.         union all
    109.         select 3 ID,11000 CODE,'杭州' NAME,10000 PARENTCODE
    110.         union all
    111.         select 4 ID,12000 CODE,'宁波' NAME,10000 PARENTCODE
    112.         union all
    113.         select 5 ID,21000 CODE,'合肥' NAME,20000 PARENTCODE
    114.         union all
    115.         select 6 ID,22000 CODE,'宣城' NAME,20000 PARENTCODE
    116.         union all
    117.         select 7 ID,11100 CODE,'萧山' NAME,11000 PARENTCODE
    118.         union all
    119.         select 8 ID,11300 CODE,'滨江' NAME,11000 PARENTCODE
    120.         union all
    121.         select 9 ID,11300 CODE,'富阳' NAME,11000 PARENTCODE
    122.        )F ON E.CODE=F.PARENTCODE
    123.     )G ORDER BY NAME_1,NAME_2;

    解题方式二:

    适用于先创建物理表:test_province_city 的情况下

    将测试数据 insert 至 test_province_city 表。

    表数据结果如下:

    将解题方式一中的数据集A,B,C,D,E,F替换成表 test_province_city即可。

    1. select NAME_1,
    2.        NAME_2,
    3.        NAME_3 
    4.  from (select NAME AS NAME_1,
    5.                 '' AS NAME_2,
    6.                 '' AS NAME_3
    7.    from test_province_city A where PARENTCODE=0
    8.     union all
    9.     select B.NAME AS NAME_1,
    10.         C.NAME AS NAME_2,
    11.         '' AS NAME_3
    12.      from test_province_city B join 
    13.       test_province_city C on B.CODE = C.PARENTCODE and B.PARENTCODE=0
    14.     union all
    15.     select D.NAME AS NAME_1,
    16.         E.NAME AS NAME_2, 
    17.         F.NAME AS NAME_3
    18.      from test_province_city D JOIN 
    19.       test_province_city E ON D.CODE=E.PARENTCODE AND D.PARENTCODE=0
    20.       JOIN test_province_city F ON E.CODE=F.PARENTCODE
    21.     )G ORDER BY NAME_1,NAME_2;

    解题思想归纳:

    1.第1个子查询,查询出省一级的信息,查询结果如下:

    1. NAME_1   NAME_2  NAME_3
    2. 浙江   
    3. 安徽 

    2.第2个子查询,查询出市二级的信息,查询结果如下:

    1. NAME_1  NAME_2  NAME_3
    2. 浙江    杭州 
    3. 浙江    宁波 
    4. 安徽    合肥 
    5. 安徽    宣城 

    3.第3个子查询,查询出区三级的信息,查询结果如下:

    1. NAME_1   NAME_2   NAME_3
    2. 浙江      杭州     滨江
    3. 浙江      杭州     富阳
    4. 浙江      杭州     萧山

    最后将这3部分的查询结果进行union all,然后按照省、市的NAME进行正序排列,最终得到如期的预期结果。

    欢迎关注【无量测试之道】公众号,回复【领取资源】

    Python+Unittest框架API自动化、

    Python+Unittest框架API自动化、

    Python+Pytest框架API自动化、

    Python+Pandas+Pyecharts大数据分析、

    Python+Selenium框架Web的UI自动化、

    Python+Appium框架APP的UI自动化、

    Python编程学习资源干货、

    Vue前端组件化框架开发、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

    包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

    微信搜索公众号:“无量测试之道”,或扫描下方二维码:

      在这里插入图片描述

    添加关注,让我们一起共同成长!

  • 相关阅读:
    提高数据科学效率的 8 个Python神库
    中国电子学会2023年09月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)
    java 02- 标识符及数据类型
    android可见即可说实现方案
    英国2.8万的A-Level学生拿不到offer
    阿里5年经验之谈 —— 浅谈自动化测试方法!
    swiper的使用,一次显示多个,竖着排列,多行多列
    React之一些函数或者方法的扩展
    【周周Python百日刷题计划】Day5~内置函数和运算符的使用
    othofinder跑出来结果缺少single_copy_othologue_sequences.
  • 原文地址:https://blog.csdn.net/weixin_41754309/article/details/125275906