专栏首页hotqin888的专栏mysql 同一张表查询 left join

mysql 同一张表查询 left join

今天群里有同学发了一个题:

一张表,如图

需要写一个sql ,输出如下结果

对这个表进行一下简单解释,其实就是省市区的关系,放在了同一张表中,level=1表示省, level=2表示市,level=3表示区

code是他们进行关系的一种表现。

就利用code做文章

sql如下:

SELECT IF(t.name=t1.name,t.name,IF(t1.name=t2.name,CONCAT(t.name,"-",t1.name),CONCAT(t.name,"-",t1.name,"-",t2.name)))  FROM Test t LEFT JOIN Test t1 ON ((t1.code-t.code)<=9000 AND (t1.code-t.code)>=1000 AND (t1.code-t.code)%1000=0) OR t1.code-t.code=0 LEFT JOIN Test t2   ON ((t2.code-t1.code)<1000 AND (t2.code-t1.code)>0) OR t2.code-t1.code=0 WHERE t.level=1

这个sql肯定需要left join 连表,因为需要3个字段,所以连3次表,利用好code直接的关系,但是不要忘记code相等的情况

code间的关系,是省市的前缀是一样的,市区的前缀是一样的,隶属关系就这样判断:

省市:(t1.code-t.code)<=9000 AND (t1.code-t.code)>=1000 AND (t1.code-t.code)%1000=0

市区:(t2.code-t1.code)<1000 AND (t2.code-t1.code)>0

首先我先写了这样的sql:

SELECT t.name,t1.name,t2.name  FROM Test t LEFT JOIN Test t1 ON ((t1.code-t.code)<=9000 AND (t1.code-t.code)>=1000 AND (t1.code-t.code)%1000=0) OR t1.code-t.code=0 LEFT JOIN Test t2   ON ((t2.code-t1.code)<1000 AND (t2.code-t1.code)>0) OR t2.code-t1.code=0 WHERE t.level=1 

结果如图:

看到这个结果,只需要在select 中使用IF函数进行判断了,结果就出来了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL连接查询&索引介绍

    但是MySQL执行的时候,并不是按顺序执行的,MySQL执行sql语句是从from开始执行的,上面这条语句的执行顺序是:

    贪挽懒月
  • MySQL联表查询的索引使用

    一共3张表knowledge, knowledge_question, knowledge_answer,数据在6000~10000之间。

    十毛
  • MySQL千万大表优化实践

    前段时间笔者遇到一个复杂的慢查询,今天有空便进行了整理,以便日后回顾。举一个相似的业务场景的例子。以文章评论为例,查询20191201~20191231日期间发...

    王知无-import_bigdata
  • MySQL基础(四)——数据查询语言DQL(三)之多表查询

      我们上篇文章给大家介绍了表查询的一些实例,这些实例均是企业面试的真题,来自牛客网。其实MySQL重在实践,语法很固定,不像算法题要有一定的思路,但是MySQ...

    一计之长
  • Apache-Flink深度解析-JOIN 算子

    在《Apache Flink 漫谈系列 - SQL概览》中我对JOIN算子有过简单的介绍,这里我们以具体实例的方式让大家对JOIN算子加深印象。JOIN的本质是...

    王知无-import_bigdata
  • mysql 如何优化left join

    今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:  selec...

    凯哥Java
  • 一文读懂JOIN联合查询

    查询左边表即from的表的全部数据和与右边表的共有数据,此时左边表的私有数据在右边表会被null补全

    石的三次方
  • 玩转Mysql系列 - 第11篇:深入了解连接查询及原理

    当我们查询的数据来源于多张表的时候,我们需要用到连接查询,连接查询使用率非常高,希望大家都务必掌握。

    路人甲Java
  • mysql数据库多表各种join用法

    在数据库查询中,往往会需要查询多个表的数据,比如查询会员信息同时查询关于这个会员的订单信息,如果分语句查询的话,效率会很低,就需要用到join关键字来连表查询了

    仙士可
  • 数据库MySQL-多表查询

    cwl_java
  • Mysql Sql 语句练习题 (50道)

    梅花
  • Apache-Flink深度解析-JOIN 算子

    在《SQL概览》中我们介绍了JOIN算子的语义和基本的使用方式,介绍过程中大家发现Apache Flink在语法语义上是遵循ANSI-SQL标准的,那么再深思一...

    王知无-import_bigdata
  • MySQL实战上车,Github仓库Star起来

    今天开了个MySQL学习仓库Up-Up-MySQL,这是一个学习MySQL从入门实战到理论完善,再到精通的一个仓库,后面会把MySQL的学习资料上传上去!欢迎大...

    公众号guangcity
  • select 高级查询之连接查询

      笛卡尔乘积是指在数学中,两个集合 X 和 Y 的笛卡尔积(Cartesian product),又称直积,表示为 X×Y,第一个对象是 X 的成员而第二个对...

    Demo_Null
  • MySQL实战二:多种查询方案

    MySQL学习仓库Up-Up-MySQL,这是一个学习MySQL从入门实战到理论完善,再到精通的一个仓库,后面会把MySQL的学习资料上传上去!欢迎大家star...

    公众号guangcity
  • 掌握MySQL连接查询到底什么是驱动表

    left join 左连接,用法如下,这种查询会把左表(student)所有数据查询出来,右表不存在的用空表示,结果图如下

    阿伟
  • MySQL数据库面试题(2020最新版)必知必会

    如需有条件地从表中选取数据,可将 where 子句添加到select语句中。 SELECT field1, field2,...fieldN FROM tab...

    JavaEdge
  • 实用 SQL 语句收藏这篇就够了

    语法:create index index_name on table_name (column_name)

    我是一条小青蛇
  • 图解 SQL 里的各种 JOIN

    从业以来主要在做客户端,用到的数据库都是表结构比较简单的 SQLite,以我那还给老师一大半的 SQL 水平倒也能对付。现在偶尔需要到后台的 SQL Serve...

    芋道源码

扫码关注云+社区

领取腾讯云代金券