学习之mysql中select两表联查后如何显示。

img

继续水题目,注意左侧两表和右侧查询结果的数据

我用的sqlitespy库,这破东西好像有些联合不支持。

我又来啦!好像跟昨天那个没什么区别

使用 union 或者 union All 的情况

img

上述例子应该这样写


SELECT
    userId AS USER_ID,
    NAME AS USER_NAME 
FROM
USER UNION
SELECT
    MEMBER_USER_ID AS USER_ID,
    MEMBER_USER_NAME AS USER_NAME 
FROM
    PRO_POSITION UNION
SELECT
    MNG_USER_ID AS USER_ID,
    MNG_USER_NAME AS USER_NAME 
FROM
    PRO_MNG

本题 的解决 sql
结果数据

img

t1 表

img

t2 表

img


SELECT * FROM T1;
SELECT * FROM T2;
-- 两组数据基本格式一样,而且数据具有相同的内容可以考虑使用union
-- 什么情况下 需要使用union 
-- 第一步 合表
SELECT 1 flag, A,B,C,D FROM T1
UNION ALL
SELECT 2 flag,A,B,C,D FROM T2;


-- 第二步 看分组条件
-- 这里是 使用类型 名称 代码 作为分组条件

-- 第三步 看需要的结果列行关系
-- 这里的结果 比原来的表 多了一列 ‘’数量2‘’ 考虑使用行转列
-- 看中间 0002 代码的数据 是表1和表2的数据 放在同一行,但没有聚合运算(sum count max 之类)

-- 最后 分析到 数量1 只展示表1 数据 ,数量2 只展示表2 数据 ,所以在第一步结果中 加上标志位
SELECT
    S.A,
    S.B,
    S.C,-- 第三步 使用case when 增加列
    max( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as E,
    max( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as F,
        sum( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as E,
    sum( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as F,
        min( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as E,
    min( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as F
    -- 这里加上 sum的目的是为了配合group by 可以将它改为 max 或者min 均可
    FROM-- 第一步 合表
    (
    SELECT
        1 flag,
        A,
        B,
        C,
        D 
    FROM
        T1 UNION ALL
    SELECT
        2 flag,
        A,
        B,
        C,
        D 
    FROM
        T2 
    ) S 
    GROUP BY-- 第二步分组条件
    S.A,
    S.B,
    S.C

CREATE TABLE book1 (
id int(11) NOT NULL AUTO_INCREMENT,
code varchar(256) NOT NULL ,
name varchar(20),
num int(3) not null default 0,
primary key (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into book1(code,name,num) values('0001','万达',24),('0002','之心城',13)

CREATE TABLE book2 (
id int(11) NOT NULL AUTO_INCREMENT,
code varchar(256) NOT NULL ,
name varchar(20),
num int(3) not null default 0,
primary key (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into book2(code,name,num) values('0002','之心城',34),('0003','国贸',22);

select name,code,sum(num1) as 'num1',sum(num2) as 'num2' from (
select name, code,num as 'num1',0 as num2 from book1
UNION
select name, code,0 as 'num1',num as 'num2' from book2
) as temp group by code

用 left join 试试,如有帮助,请点击我评论上方【采纳该答案】按钮支持一下。

  • 题主的原数据
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1`  (
  `ID` bigint(20) NOT NULL,
  `A` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `B` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `C` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `D` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `E` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `F` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t1
-- ----------------------------
INSERT INTO `t1` VALUES (1, '商场', '万达', '0001', '24', NULL, NULL);
INSERT INTO `t1` VALUES (2, '商场', '之心城', '0002', '13', NULL, NULL);
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2`  (
  `ID` bigint(20) NOT NULL,
  `A` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `B` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `C` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `D` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `E` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `F` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t2
-- ----------------------------
INSERT INTO `t2` VALUES (1, '商场', '之心城', '0002', '34', NULL, NULL);
INSERT INTO `t2` VALUES (2, '商场', '国贸', '0003', '22', NULL, NULL);
  • 参考sql
SELECT
    S.A 类型,
    S.B 名称,
    S.C 代码,-- 第三步 使用case when 增加列
    max( CASE WHEN s.flag =1 THEN s.D ELSE 0 END ) as '数量1',
    max( CASE WHEN s.flag =2 THEN s.D ELSE 0 END ) as '数量2'

    -- 这里加上 sum的目的是为了配合group by 可以将它改为 max 或者min 均可
    FROM-- 第一步 合表
    (
    SELECT
        1 flag,
        A,
        B,
        C,
        D 
    FROM
        T1 UNION ALL
    SELECT
        2 flag,
        A,
        B,
        C,
        D 
    FROM
        T2 
    ) S 
    GROUP BY-- 第二步分组条件
    S.A,
    S.B,
    S.C;

  • 结果

img