前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空。

  需求并不难,用程序代码循环处理就可以了。但是后面涉及到打印报表,只能用纯sql语句生成。开始自己用了union 写的复杂了一些,后来百度了下文章看到一种实现思路,在此记录一下。下面的内容是根据其思路分析自己修改实现的一个demo,也简单扩展了一点实现功能。

直接上代码好了:

-- ----------------------------
-- Table structure for act
-- ----------------------------
DROP TABLE IF EXISTS `act`;
CREATE TABLE `act`  (
  `id` ) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'name',
  `type` ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'type',
  `peple` ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'peple',
  `age` ) NULL DEFAULT NULL COMMENT 'age',
  `sex` ) NULL DEFAULT NULL COMMENT 'sex',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE  CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of act
-- ----------------------------
, , );
, , );
, , );
, , );
, , );
, , );
, , );
, , );
, , );

生成表数据:

下面案列是以type相同与否作为判断条件分组,peple就是type的小写,方便对照观察。后面的Bk结尾的别名字段也是方便对照观察加上的。

实现sql:

SELECT
id,
CASE
               WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.name = a.name
                         GROUP BY type

                       ) THEN name
             WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.name = a.name
                         GROUP BY type

                       ) THEN name
             ELSE ''
        END AS 'name' ,
        CASE WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type

                         GROUP BY type

                       ) THEN type
             WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type
                         GROUP BY type

                       ) THEN type
             ELSE ''
        END AS type,
                 CASE WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.age = a.age

                         GROUP BY type

                       ) THEN age
             WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.age = a.age
                         GROUP BY type

                       ) THEN age
             ELSE ''
        END AS age,
                CASE WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.sex = a.sex

                         GROUP BY type

                       ) THEN sex
             WHEN id in ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.sex = a.sex
                         GROUP BY type

                       ) THEN sex
             ELSE ''
        END AS sex, 

         peple,name as nameBk,age as ageBk,sex as sexBk
FROM    (select * from act order by type,id asc) as b

执行结果:

如果干脆要把任意字段置空(不管是不是重复的)也可以:

SELECT
id,
CASE
               WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type
                         GROUP BY type

                       ) THEN name
             WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type
                         GROUP BY type

                       ) THEN name
             ELSE ''
        END AS name,
        CASE WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type

                         GROUP BY type

                       ) THEN type
             WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type
                         GROUP BY type

                       ) THEN type
             ELSE ''
        END AS type,
                 CASE WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type

                         GROUP BY type

                       ) THEN age
             WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type
                         GROUP BY type

                       ) THEN age
             ELSE ''
        END AS age,
                CASE WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type

                         GROUP BY type

                       ) THEN sex
             WHEN id = ( SELECT MIN(id)
                         FROM   (select * from act) as a
                         WHERE  b.type = a.type
                         GROUP BY type

                       ) THEN sex
             ELSE ''
        END AS sex, 

         peple,name as nameBk,age as ageBk,sex as sexBk
FROM    (select * from act order by type,id asc) as b

执行结果:

上面案例都是以type作为判断分组条件,如果是有多个字段,直接在后面接着增加就可以了。

Mysql重复数据查询置为空的更多相关文章

  1. mysql重复数据查询

    假设有表test mysql> select * from test; +----+------+------+ | id | name | sex | +----+------+------+ ...

  2. 删除MySQL重复数据

    删除MySQL重复数据 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据.因为在采集中,对于同一台设备,同一个时间点应该只有一个数据,然 ...

  3. 【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)

    上周三面试题有两道涉及Oracle的分页查询,没有意外地凉了,现在总结一下. · Mysql mysql的分页可以直接使用关键字limit,句子写起来比较方便. 语法: ① limit m,n -- ...

  4. MySQL:数据查询

    数据查询 一.基本查询语句 1.语法:写一行 select{*<字段列表>}//查询的字段,多个字段用逗号分开 from<表1>,<表2>…//数据表名 {//可选 ...

  5. mysql 大数据 查询方面的测试

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  6. mysql 重复数据防止插入:)

    insert into table (id, name, age) values(1, "A", 19) on duplicate key update name=values(n ...

  7. MySql的数据查询

    SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能却相当强大.SELECT语句的基本语法如下: select selection_list//要查询的内容,选择哪些列 from数据表名/ ...

  8. SpringMVC+Mybatis实现的Mysql分页数据查询

    周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...

  9. Python MySQL - 进行数据查询

    #coding=utf-8 import mysql.connector import importlib import sys # reload(sys) # sys.setdefaultencod ...

随机推荐

  1. Apache2.4更改默认根目录并配置虚拟域名

    软件环境: 1.virtualbox中安装Ubuntu 16.04-server 2.window7下安装Xshell5 以上安装好后, 1.设置virtualbox网络为桥接网卡,启动Ubuntu. ...

  2. 域名IP绑定

    该文为阿里云域名举例 首先具备3个前提: 买服务器并搭建环境:阿里云官网购买阿里云的服务器(我购买的是window系统,ECS服务器). 在自己的云服务器上布置上jdk,配置环境变量:安装上tomca ...

  3. php中的empty()方法

    empty() 判断一个变量是否为“空”,isset() 判断一个变量是否已经设置.empty还会检测变量是否为空.为零.当一个变量值为0,empty() 认为这个变量同等于空,即相当于没有设置.例如 ...

  4. html_entity_decode()、空格、&nbsp; 乱码问题

    普通 ASCII 码空格为 32,但是浏览器会对普通空格进行自动归并,也就是如果你输入10个 0x20 的空格在HTML页面里面,可能会被合并成一个空格. 如果想要一致的呈现多个空格,就要用到 编码标 ...

  5. 继续聊WPF——为ListView的行设置样式

    <Window x:Class="Wpf_GridHeaderStyle_sample.Window1" xmlns="http://schemas.microso ...

  6. Golang - 并发编程

    目录 Golang - 并发编程 1. 并行和并发 2. go语言并发优势 3. goroutine是什么 4. 创建goroutine 5. runtime包 6. channel是什么 7. ch ...

  7. Atomic operations on the x86 processors

    On the Intel type of x86 processors including AMD, increasingly there are more CPU cores or processo ...

  8. 洛谷 P2534 [AHOI2012]铁盘整理

    P2534 [AHOI2012]铁盘整理 题目描述 输入输出格式 输入格式: 共两行.第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R.(1& ...

  9. 今天玩了tensorflow playground,太好玩了

    先上地址: http://playground.tensorflow.org 我试了一个最复杂的,螺旋形的.开始怎么训练都不行.后来我多加了几个神经元,居然能训练成功了.真是太牛逼了!

  10. POJ 1654

    不知 是怎么看出的精度不够,吸经验吧. #include <iostream> #include <cstdio> #include <cstring> #incl ...