Mysql重复数据查询置为空
前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空。
需求并不难,用程序代码循环处理就可以了。但是后面涉及到打印报表,只能用纯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重复数据查询置为空的更多相关文章
- mysql重复数据查询
假设有表test mysql> select * from test; +----+------+------+ | id | name | sex | +----+------+------+ ...
- 删除MySQL重复数据
删除MySQL重复数据 项目背景 在最近做的一个linux性能采集项目中,发现线程的程序入库很慢,再仔细定位,发现数据库里面很多冗余数据.因为在采集中,对于同一台设备,同一个时间点应该只有一个数据,然 ...
- 【SQL】Oracle和Mysql的分页、重复数据查询(limit、rownum、rowid)
上周三面试题有两道涉及Oracle的分页查询,没有意外地凉了,现在总结一下. · Mysql mysql的分页可以直接使用关键字limit,句子写起来比较方便. 语法: ① limit m,n -- ...
- MySQL:数据查询
数据查询 一.基本查询语句 1.语法:写一行 select{*<字段列表>}//查询的字段,多个字段用逗号分开 from<表1>,<表2>…//数据表名 {//可选 ...
- mysql 大数据 查询方面的测试
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- mysql 重复数据防止插入:)
insert into table (id, name, age) values(1, "A", 19) on duplicate key update name=values(n ...
- MySql的数据查询
SELECT语句是最常用的查询语句,它的使用方式有些复杂,但功能却相当强大.SELECT语句的基本语法如下: select selection_list//要查询的内容,选择哪些列 from数据表名/ ...
- SpringMVC+Mybatis实现的Mysql分页数据查询
周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...
- Python MySQL - 进行数据查询
#coding=utf-8 import mysql.connector import importlib import sys # reload(sys) # sys.setdefaultencod ...
随机推荐
- [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)
传送门 Description 给出 n 个点和 n−1 种颜色,每种颜色有若干条边.求这张图多少棵每种颜色的边都出现过的生成树,答案对 109+7 取模. Input 第一行包含一个正整数 N(N& ...
- 使用Vue CLI 3将基于element-ui二次封装的组件发布到npm
前言:之前在网上找的好多都是基于vue-cli 2.x的,而使用vue-cli 3的文章比较少,Vue CLI 3 中文文档,所以我在自己尝试的时候把几篇文章结合了一下,调出来了我想要的模式,也就是V ...
- windows 禁用 magic mouse2 左右移动
相信大部分程序员同志,只要用macbook都回装双系统的,本人也不例外,因为需要用到vs等很多开发工具. magic mouse2在osx上的表现本人不做评论,没用过几回,在win10上的表现太差劲了 ...
- IE-FSC
Top3: Top2: FSC related to Redis: (Redis = https://www.cnblogs.com/ngtest/p/10693750.html) FSC statu ...
- 0923如何利用mysqlbinlog日志闪回
转自 https://github.com/danfengcao/binlog2sql,感谢作者的提供 binlog2sql 从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始 ...
- 小记——Grub Rescue恢复
下面我要讲的是一个悲伤的故事 引子 电脑状况简介:两块硬盘(1HHD.1SSD),SSD上装了LINUX(40G)+WIN10(50G)的双系统,SSD剩余部分在WIN下使用装程序,HHD做仓库.LI ...
- String 经常用法最优算法实现总结 (一)
<pre name="code" class="java"><span style="font-family: Arial, Hel ...
- Mybatis结合Spring注解自己主动扫描源代码分析
作为一个想做架构师的程序猿,必须是一个优秀的程序猿.在引入某一个框架的时候,必需要研究源代码,将新的开源框架的风险变为可控性. 1.Spring结合Mybatis最经常使用的配置. <!--理论 ...
- Webx框架:Spring Schema 和 Spring Ext
webx诞生的原因是当时市面上没有好用的web框架.如今的Web框架有非常多.然后它们背后的思想都是相似的,并且越来越趋同. Spring Schema 在传统的spring中,配置bean时须要手动 ...
- 基于FPGA的VGA可移植模块终极设计【转】
本文转载自:http://www.cnblogs.com/lueguo/p/3373643.html 略过天涯 基于FPGA的VGA可移植模块终极设计 一.VGA的诱惑 首先,VGA的驱动,这事, ...