要点:1.pid和id的关系,省市之间的从属关系,可以引申为客户发展下线的统计(听着像传销)。

2. MySQL和PostresSQL之间不能通用的部分

3. group by 和 group_concat

4.with RECURSIVE cte as 的理解

SQL交流群里面有个人提了个问题:

怎么查询会员表中 下级会员 个数大于10的会员?

会员表A
字段  userid(会员ID),NAME(会员名称),suID(会员上级ID)

同一个会员发展的下线会员有同样的suid,以上级的id分组,having出>10,内连接

子查询的suid就是下级会员数大于10的人的userid,为了找出这些人的name需要再连接原表

select users.userid, users.username, t.sumid
from (select suid ,count(suid) as sumid from users  group by suid  having count(suid) >10) as t INNER JOIN users ON t.suid=users.userid

我又想到了我之前做的一个递归的查询,统计各省及其市和区。有类似的感觉,都是父系id关系。

with RECURSIVE cte as
(
select id,cast(name as varchar(100)) from tb  where id='002'
union all
select k.id,cast(c.name||'>'||k.name as varchar(100)) as name  from tb k inner join cte c on c.id = k.pid
)select id,name from cte ;

首先梳理下我这个查询的意思。

扩展到我这个tb表,就是查询每个省下面有几个市?每个市有多少个区?

tb表中id是主键,pid是父id。省的pid=0,市的pid=所在省,区的pid=所在市。

每个省有多少个市?(原表是示例表,不全)

SELECT a.name, COUNT(tb.pid) as "城市"
FROM    (SELECT *FROM tbWHERE id IN ('001', '002')) aINNER JOIN tbON a.id = tb.pid
GROUP BY a.name
/*
name    城市
浙江省 11
广东省 2
*/

3. 想统计出来每个市有多少个区?

这里面应该需要用到递归,因为储存的机制是

SELECT *
FROM ((select id as ids,cast(name as varchar(100)) as names from tb  where id='002') aINNER JOINtb ON tb.pid = a.ids) cINNER JOIN tb as b ON b.pid = c.id

WITH ojbk as (
SELECT names as prov, c.name as city, b.name as qu
FROM ((select id as ids,cast(name as varchar(100)) as names from tb  where id='002') aINNER JOINtb ON tb.pid = a.ids) cINNER JOIN tb as b ON b.pid = c.id
)
SELECT city, COUNT(qu) as numqu
FROM ojbk
GROUP BY city

这样就查询出来每个市有几个区。

之前接触过MySQL里面的一个函数,GROUP_CONCAT能一次性展示分组内的东西。可惜不是标准SQL的语法,所以在MySQL里面再来一次。

create table tb(id varchar(3) , pid varchar(3) , named varchar(10)); insert into tb values('002' , 0 , '浙江省');
insert into tb values('001' , 0 , '广东省');
insert into tb values('003' , '002' , '衢州市');
insert into tb values('004' , '002' , '杭州市') ;
insert into tb values('005' , '002' , '湖州市');
insert into tb values('006' , '002' , '嘉兴市') ;
insert into tb values('007' , '002' , '宁波市');
insert into tb values('008' , '002' , '绍兴市') ;
insert into tb values('009' , '002' , '台州市');
insert into tb values('010' , '002' , '温州市') ;
insert into tb values('011' , '002' , '丽水市');
insert into tb values('012' , '002' , '金华市') ;
insert into tb values('013' , '002' , '舟山市');
insert into tb values('014' , '004' , '上城区') ;
insert into tb values('015' , '004' , '下城区');
insert into tb values('016' , '004' , '拱墅区') ;
insert into tb values('017' , '004' , '余杭区') ;
insert into tb values('018' , '011' , '金东区') ;
insert into tb values('019' , '001' , '广州市') ;
insert into tb values('020' , '001' , '深圳市') ;

但是可惜MySQL也不支持CTE公用表表达式。只能创建临时表

-- mysql不支持with,要创建临时表
DROP TEMPORARY TABLE IF EXISTS tmp_table;CREATE TEMPORARY TABLE tmp_table (prov VARCHAR(10) NOT NULL,city VARCHAR(10) NOT NULL,qu VARCHAR(10) NOT NULL);
INSERT INTO tmp_table
(
SELECT namedd as prov, tb.named as city, b.named as qu
FROM (select id as ids, named as namedd from tb  where id='002') aINNER JOINtb ON tb.pid = a.idsINNER JOIN tb as b ON b.pid = tb.id
);

SELECT city, GROUP_CONCAT(qu)
FROM tmp_table
GROUP BY city;

之前做的递归有些忘记了,这一次加深了下理解。

递归里面的union all 像俄罗斯方块一样垒起来。

觉得总有些地方做的不够完善,想把全国的省市做一下。

============================================================================

SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for ims_shop_region
-- ----------------------------
DROP TABLE IF EXISTS `ims_shop_region`;
CREATE TABLE `ims_shop_region` (`region_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`parent_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '父级id',`region_name` varchar(120) NOT NULL DEFAULT '' COMMENT '地域名',`region_type` tinyint(1) NOT NULL DEFAULT '2' COMMENT '地域级别:1省,2市,3区',`agency_id` smallint(5) unsigned NOT NULL DEFAULT '0',PRIMARY KEY (`region_id`),KEY `parent_id` (`parent_id`) USING BTREE,KEY `region_type` (`region_type`) USING BTREE,KEY `agency_id` (`agency_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=3409 DEFAULT CHARSET=utf8 COMMENT='全国地区表';-- ----------------------------
-- Records of ims_shop_region
-- ----------------------------
INSERT INTO `ims_shop_region` VALUES ('1', '0', '中国', '0', '0');
INSERT INTO `ims_shop_region` VALUES ('2', '1', '北京', '1', '0');
INSERT INTO `ims_shop_region` VALUES ('3', '1', '安徽', '1', '0');
......

开始做的过程中遇到了一些问题,想根据ims_shop_region表复现轨迹 
但是存在一个问题就是创建ims_shop_region这个表的语法的mysql的,mysql中没有with
尝试做一下国家联动,省市联动,省市区联动。
这里面能做的很多,可以拿type来限制,省市区。

而且用两个group by 可以搞出来全表查询,因为只有三个等级划分。

-- 找到一个省的所有市

SELECT a.region_name as '省', b.region_name as '市'
FROM ims_shop_region aLEFT JOIN ims_shop_region bON a.region_id = b.parent_id
WHERE a.region_name = '河南'

-- 找到每个省的所有市,两种表达方式,一种是竖着,一种是横着。

-- 横着GROUP_CONCAT(expr)

通过改变type可以变更查找省市关系还是市县关系
-- 竖着
-- 这里group by 用了两次,就好像一个星期中的每一天,要先定tyoe为1,这样等级才对啊,区就不展示了,用count显示下数值就行.注意要多引用一次原表

SELECT a.region_name as '省', b.region_name as '市', COUNT(*) as numqu
FROM ims_shop_region aLEFT JOIN ims_shop_region bON a.region_id = b.parent_idINNER JOINims_shop_region cON b.region_id = c.parent_id
WHERE a.region_type = 1
GROUP BY a.region_name, b.region_name

-- 全部省市区
SELECT a.region_name as '省', b.region_name as '市', c.region_name as '区/县'
FROM ims_shop_region aLEFT JOIN ims_shop_region bON a.region_id = b.parent_idINNER JOINims_shop_region cON b.region_id = c.parent_id
WHERE a.region_type = 1
GROUP BY a.region_name, b.region_name, c.region_name

SQL汇总显示各个省包所含的城市及县区相关推荐

  1. PL/SQL程序设计 第七章 包的创建和应用

    §7.1  引言 包是一组相关过程.函数.变量.常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL 程序设计元素的封装.包类似于C++和JAVA语言中的 ...

  2. aws rds监控慢sql_在AWS RDS SQL Server上使用SSIS包

    aws rds监控慢sql In the first part of the article, Explore SQL Server Integration Services (SSIS) on AW ...

  3. Druid monitor中SQL监控显示不出数据(已解决)

    Druid monitor中SQL监控显示不出数据(已解决) 检查方法一: 查看Druid monitor中的数据源是否可访问 如下图则数据源可访问: 这时检查application.yaml中的配置 ...

  4. oracle数据库dba面试题,DBA笔试题5:SQL汇总

    1. ORACLE用来判断列值是否为空的操作符是____ A ==NULL B IS NULL C AS NULL D NULLIS 2 分析以下的 SQL命令 SELECT i.id_number, ...

  5. SQL面试必会50题(含答案和学习链接)

    最近在刷 sql 题,刷完了网上的 SQL 面试必会 50 题,现把我的答案和思路整理如下,供大家参考. 这是目录 一.创建四张表 二.SQL面试必会50题(不含答案) 三.SQL面试必会50题(含答 ...

  6. PL/SQL 中文显示乱码解决方案

    为什么80%的码农都做不了架构师?>>>    PL/SQL 中文显示乱码: 1.修改注册表进行设置: HKEY_LOCAL_MACHINE->SOFTWARE->ORA ...

  7. MySQL根据员工姓名所在部门_用一条SQL语句显示所有人员的姓名及所在部门

    给定以下两个表:部门ID部门名称1部门12部门23部门34部门4人员ID人员姓名部门ID1姓名112姓名213姓名324姓名435姓名55(1)用一条SQL语句显示所有人员的姓名及所在部门,没有部门的 ...

  8. [MSSQL]也说SQL中显示星期几函数

    网上盛传着三个版本,分别来看下 版本1 http://bernardstudios.com/select-day-of-week-name-using-t-sql/ SELECT CASE (DATE ...

  9. oracle时分秒修改值_Oracle SQL Developer显示的时间包含时分秒的设置方法

    Oracle SQL Developer是Oracle公司出品的一个免费的集成开发环境.Oracle SQL Developer 是一个免费非开源的用以开发数据库应用程序的图形化工具,使用 SQL D ...

最新文章

  1. cve-2017–10271 XMLDecoder 反序列化漏洞 原理分析
  2. LINUX设备驱动程序的注意事项(两)建设和执行模块
  3. angular学习笔记(十九)-自定义指令修改dom
  4. Learning to Rank:X-wise
  5. react中实现异步请求的方法一,react-thunk
  6. 请解释Spring Bean 的生命周期?
  7. store_coding_state (cs_cm)的作用
  8. Notes on UNPv1 Ch.5
  9. php7 php5 区别,php7与php5的区别有哪些?
  10. 行为型设计模式(2)—— 模板方法模式(Template Method Pattern)
  11. QuickGUI编辑器系列---从文件中读取并解析
  12. Flask 的路由系统 FBV 与 CBV
  13. Angular 学习笔记——$interpolateProvide
  14. 哥德巴赫猜想C++实现
  15. python 重命名的方法,python 怎么重命名文件
  16. 区块链十年一梦:有人辞官归故里,有人星夜来赶考
  17. SpringCloud Config连接私有仓库时的配置(记录一下)
  18. layer 弹出层传递参数
  19. Don‘t make users think
  20. 二次元PHP随机api接口源码,随机二次元图片API接口php源码

热门文章

  1. 基于51单片机的智能停车场车位收费系统原理图PCB
  2. 学生管理系统——PHP
  3. word中新建的标题编号与上一级的标题编号没有顺承的一种解决方法
  4. AI领域真正最稀缺的人才是会庖丁解牛的那个人
  5. 女生学计算机真的难吗,女生想学计算机科学与技术,怕很难学懂,这门学科是不是特别难?女生学到底好不好?...
  6. 英文姓名 格式 结构
  7. win10安装软件出现乱码怎么办
  8. 【海岛吉他7】吉他琴弦间音程度数关系
  9. hbs模块 mysql_让koa-hbs模块支撑koa2
  10. 如何借助有道词典快速读英文文献