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

  需求并不难,用程序代码循环处理就可以了。但是后面涉及到打印报表,只能用纯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. [USACO5.5]隐藏口令Hidden Password [最小表示法模板]

    最小表示法就是一个字符串构成一个环,找以哪个点为开头字典序最小. 然后我们就可以用n2的算法愉快的做啦~实际上有O(n)的做法的,就是用两个指针扫,如果这两个位置的字典序相等,就一起往后,如果某一个大 ...

  2. mac Gitblit安装

    jdk下载传送门 gitBlit是java编写的的 第一步 需要安装java jdk 传送门 JDK6的下载地址: http://www.oracle.com/technetwork/java/jav ...

  3. ISAP 算法的学习

    http://www.renfei.org/blog/isap.html 算法与数学 网络流-最大流问题 ISAP 算法解释 2013-08-07Renfei Song 2 条评论 内容提要 [隐藏] ...

  4. 敏捷迭代:Sprint燃尽图的7个图形特征及说明的问题

    本文写于很多年前(2006),并在很多地方被引用.而现在,笔者对于Sprint燃尽图的理解有了戏剧性的变化--在看到很多团队滥用它之后.笔者不再建议团队做Sprint燃尽图,因为它们不仅不会增加多少有 ...

  5. JS判断手机浏览器内核

    function is_weixn_qq() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) ...

  6. 解决TortoiseGit下载代码每次要输入用户名、密码

    解决办法: 方案1: 右键>ortoiseGit → Settings → Git → Credential 设置为 wincred - this repository only 或者 winc ...

  7. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  8. Thinking in Java:容器深入研究

    1.虚线框表示Abstract类,图中大量的类的名字都是以Abstract开头的,它们仅仅是部分实现了特定接口的工具,因此创建时能够选择从Abstract继承. Collections中的实用方法:挑 ...

  9. vim相关资料

    http://www.360doc.cn/article/15064667_402846667.html http://blog.jobbole.com/86809/ http://blog.csdn ...

  10. gcc 4.8安装

    suse的安装参考:http://blog.csdn.net/cloudskyfhx/article/details/17660607 有些错误处理见本文黄色部分 CentOS 6.4 编译安装 gc ...