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 ...
随机推荐
- Noip 2015 练习
子串 传送门 Solution \(f[i][j][k]\)表示A到i,B到j第k个子串的答案 \(g[i][j][k]\)表示A到i,B到j第k个子串且A[i]一定使用 \(g[i][j][k]=( ...
- Keil
Keil C51 V9.00 即09年发布的最新版本uVision 4,版本外观改变比较大,可以使用以前的注册文件.如果全新安装,在VISTA或者WIN 7系统下,请使用管理员方式运行,然后注册即可无 ...
- 4.Thymeleaf的常用标签
一.常用标签 二.foreach案例 1.创建项目 2. 创建Student.java package cn.kgc.pojo; /** * Created by Administrator on 2 ...
- vue 封装axios以及使用中间代理 proxy
为什么需要封装呢?主要是为了更好管理项目以及增加复用性 1.首先在src文件夹下创建api文件夹 . utils文件夹 . server文件夹 api:创建一个index.js文件 用来存放接口地 ...
- 调试中的step into step over step out
step into/step out/step over的差别 step into就是单步运行,遇到子函数就进入而且继续单步运行: step over是在单步运行时,在函数内遇到子函数时不会进入子函数 ...
- 【BZOJ】2140 稳定婚姻
[解析]Hash,离散化.Tarjan [分析] 对于每一个名字.首先离散化成编号. 用hash或者其它,反正不要最主要的即可了.否则O(N^2L)会爆掉. 然后请參考:http://www.cnbl ...
- luogu1896 [SCOI2005]互不侵犯 状压DP
题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.( 1 <=N <=9, 0 ...
- 怎样才是一个基本水平的java程序员?
怎样才是一个基本水平的java程序员? 熟悉常用的数据结构,包括数组,链表,树,哈希表等. 熟悉结构化编程和面向对象编程. 能够阅读UML设计图,根据UML语义进行编码 了解RDBMS和SQL的使用, ...
- suse linux通过iso文件安装gcc
mount -t iso9660 -o loop SLES-11-SP4-DVD-x86_64-GM-DVD1.iso /media/#仅仅上述iso1即可 不需要mount iso2 mount - ...
- DDos攻击的一些领域知识——(流量模型针对稳定业务比较有效)不稳定业务采用流量成本的检测算法,攻击发生的时候网络中各个协议的占比发生了明显的变化
在过去,很多防火墙对于DDoS攻击的检测一般是基于一个预先设定的流量阈值,超过一定的阈值,则会产生告警事件,做的细一些的可能会针对不同的流量特征设置不同的告警曲线,这样当某种攻击突然出现的时候,比如S ...