mysql 修改字段类型合并重复字段的方法

MySQL处理重复 防止重复数据实例-mysql教程-数据库-壹聚教程网MySQL处理重复 防止重复数据实例
本文章来给大家介绍一下关于MySQL处理重复 防止重复数据技巧与方法吧,希望此文章对各位同学会有所帮助哦。
有时表或结果集包含重复的记录。有时它是允许的,但有时它需要停止重复的记录。有时它需要识别重复的记录从表中删除。本章将介绍如何防止发生在一个表中重复的记录如何删除已经存在的重复记录。
防止重复表中的发生:
可以使用PRIMARY KEY或UNIQUE索引的表上相应的字段来防止重复的记录。让我们举一个例子,下面的表中不包含这样的索引或主键,所以它会允许记录first_name和last_name重复
CREATE TABLE person_tbl
&&& first_name CHAR(20),
&&& last_name CHAR(20),
&&& sex CHAR(10)
可以使用PRIMARY KEY或UNIQUE索引的表上相应的字段防止重复的记录。让我们举一个例子,下面的表中不包含这样的索引或主键,所以它会允许重复first_name和last_name记录
CREATE TABLE person_tbl
&& first_name CHAR(20) NOT NULL,
&& last_name CHAR(20) NOT NULL,
&& sex CHAR(10)
&& PRIMARY KEY (last_name, first_name)
表中的唯一索引的存在通常会导致错误的发生,如果表中插入一条记录,重复定义索引的列或列中的现有记录。
使用INSERT IGNORE而不是INSERT。如果记录不重复现有的记录,MySQL将插入它像往常一样。如果记录是重复IGNORE关键字告诉MySQL静静地抛弃它,而不会产生错误。
下面的示例中没有错误,同时也不会插入重复的记录。
mysql& INSERT IGNORE INTO person_tbl (last_name, first_name)
&&& -& VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql& INSERT IGNORE INTO person_tbl (last_name, first_name)
&&& -& VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
使用替换而不是INSERT。如果记录是新的它INSERT插入。如果它是一个重复的,新的记录将取代旧的:
mysql& REPLACE INTO person_tbl (last_name, first_name)
&&& -& VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql& REPLACE INTO person_tbl (last_name, first_name)
&&& -& VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
使用REPLACE而不是INSERT。如果记录是新的它INSERT插入。如果它是一个重复的,新的记录将取代旧的:
强制唯一性的另一种方法是添加一个UNIQUE索引,而不是一个PRIMARY KEY表。
CREATE TABLE person_tbl
&& first_name CHAR(20) NOT NULL,
&& last_name CHAR(20) NOT NULL,
&& sex CHAR(10)
&& UNIQUE (last_name, first_name)
计算和确定重复:
以下是查询数first_name和last_name表中的重复记录。
mysql& SELECT COUNT(*) as repetitions, last_name, first_name
&&& -& FROM person_tbl
&&& -& GROUP BY last_name, first_name
&&& -& HAVING repetitions & 1;
这个查询将返回一个列表的所有person_tbl表中重复的记录。在一般情况下,识别重复的值,请执行以下操作:
确定哪一列包含的值可能会重复。
在列选择列表中随着COUNT(*)列出的那些列。
以及在GROUP BY子句中列出的列。
新增的HAVING子句消除了独特的值要求的组数大于1。
消除重复查询结果:
可以使用DISTINCT与SELECT语句一起找出表中唯一的纪录。
mysql& SELECT DISTINCT last_name, first_name
&&& -& FROM person_tbl
&&& -& ORDER BY last_
DISTINCT是添加一个GROUP BY子句中命名的列,选择的另一种方法。这具有除去重复和只选择的独特的组合中的指定的列的值的效果:
mysql& SELECT last_name, first_name
&&& -& FROM person_tbl
&&& -& GROUP BY (last_name, first_name);
删除重复使用表更换:
如果在一个表中有重复的记录,想从该表中删除所有的重复记录,看看下面程序的例子。
mysql& CREATE TABLE tmp SELECT last_name, first_name, sex
&&& -&&&&&&&&&&&&&&&&&& FROM person_
&&& -&&&&&&&&&&&&&&&&&& GROUP BY (last_name, first_name);
mysql& DROP TABLE person_
mysql& ALTER TABLE tmp RENAME TO person_
从一个表中删除重复记录的一个简单的方法是添加KEY,表索引或PRIMAY。如果该表已经是可用的,那么使用此方法删除重复的记录。
mysql& ALTER IGNORE TABLE person_tbl
&&& -& ADD PRIMARY KEY (last_name, first_name);
下面总结一下mysql删除重复记录的一些方法
我最常用的方法是
//删除id重复的数据,适合id是手工主键
delete person as a from person as a,
*,min(id) from person
id having count(1) & 1
where a.id = b.id
//查找重复的,并且除掉最小的那个
delete tb_person as a from tb_person as a,
select *,min(id) from tb_person& group by name having count(1) & 1
&where a.name = b.name and a.id & b.
好了下面再总结一些
1. 查询需要删除的记录,会保留一条记录。
select a.id,a.subject,a.RECEIVER from test1 a left join (select c.subject,c.RECEIVER ,max(c.id) as& bid from test1 c where status=0 GROUP BY RECEIVER,SUBJECT having count(1) &1) b on a.id& b.bid where& a.subject=b.subject and a.RECEIVER = b.RECEIVER and a.id & b.bid
2. 删除重复记录,只保留一条记录。注意,subject,RECEIVER 要索引,否则会很慢的。
delete a from test1 a, (select c.subject,c.RECEIVER ,max(c.id) as& bid from test1 c where status=0 GROUP BY RECEIVER,SUBJECT having count(1) &1) b where a.subject=b.subject and a.RECEIVER = b.RECEIVER and a.id & b.
3. 查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
select * from people
where peopleId in (select& peopleId& from& people& group& by& peopleId& having& count(peopleId) & 1)
4. 删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
delete from people
where peopleId& in (select& peopleId& from people& group& by& peopleId&& having& count(peopleId) & 1)
and rowid not in (select min(rowid) from& people& group by peopleId& having count(peopleId )&1)
5.删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in& (select peopleId,seq from vitae group by peopleId,seq having count(*) & 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)&1)
更多详细内容请查看:http://www.111cn.net/database/mysql/47531.htm
上一页: &&&&&下一页:相关内容12:11 提问
MYSQL 中怎样把同一张表中相同字段的内容合并为一条记录?
我的表现在是这样的:
购买产品id
想让表转变成:
购买产品id
123,124,125,126
也就是说把一个客户购买的产品合并显示在一条记录中。
按赞数排序
使用group_concat
用行转列实现,今天上午看到一个和你的问题完全符合
其他相似问题mysql两表联合查询,两个表结构一样,多个字段中的3个字段,只要这3个字段有重复的就罗列出来 - ITeye问答
a表与b表字段都是相同的,字段为:
险种,车牌,发动机号,车大架号
现在想实现的是:
只要a表的险种与b表的险种相同,并且a表的车牌,发动机号,车大架号与b表的车牌,发动机号,车大架号只要3个中的一个相同,则显示出来相同的记录。
a表创建及记录:
DROP TABLE IF EXISTS `a`;
CREATE TABLE `a` (
& `xianzhong` varchar(30) DEFAULT NULL,
& `chepai` varchar(20) DEFAULT NULL,
& `fadongji` varchar(30) DEFAULT NULL,
& `chejiahao` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=
INSERT INTO `a` VALUES ('DAA','吉B3120挂','无','');
INSERT INTO `a` VALUES ('DZA','吉B3120挂','无','');
INSERT INTO `a` VALUES ('DAA','暂未上牌','ABCD','无');
INSERT INTO `a` VALUES ('DAA','吉B3146挂','无','');
INSERT INTO `a` VALUES ('DZA','吉B3146挂','无','');
b表创建及记录:
DROP TABLE IF EXISTS `b`;
CREATE TABLE `b` (
& `xianzhong` varchar(30) DEFAULT NULL,
& `chepai` varchar(20) DEFAULT NULL,
& `fadongji` varchar(30) DEFAULT NULL,
& `chejiahao` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=
INSERT INTO `b` VALUES ('DAA','吉B3120挂','无','LH9B3G40090HHT174');
INSERT INTO `b` VALUES ('DZA','吉B3120挂','无','LH9B3G40090HHT174');
INSERT INTO `b` VALUES ('DAA','吉B12345','','1345');
INSERT INTO `b` VALUES ('DAA','吉B3146挂','无','LH9B3G40990HHT173');
INSERT INTO `b` VALUES ('DZA','吉B3146挂','无','LH9B3G40990HHT173');
a表及b表及想要的结果图片如下,请大家bangbang忙,实在想不到该怎么查询了,先谢谢大家了。
想要的查询结果
问题补充:kidding87 写道想了半天也不知道楼主要的是什么结果。。。
第3张图片就是我想要的结果
我需要sql语句
问题补充:kidding87 写道这个结果是怎么得到的呢?
我手动弄的
我是为了让大家看的直观
刚才在百度有个高手给了我这句
select b.* from a left join b on a.xianzhong=b.xianzhong where ( (a.chepai=b.chepai) + (a.fadongji=b.fadongji) + (a.chejiahao=b.chejiahao) )&1
你帮我看看
问题补充:kidding87 写道我咋说,我做了半天也不知道你的结果怎么来的
他的这个不知道你用mysql运行过结果没
我没有mysql,用的oracle
应该就是下面的这个意思
select b.*
left join b
on a.xianzhong = b.xianzhong
where (a.chepai = b.chepai) or (a.fadongji = b.fadongji) or
(a.chejiahao = b.chejiahao)
这个不对 你的结果列出了很多条记录
问题补充:kidding87 写道哥哥,我就想问,你的结果到底要算的是什么。
只要a表的险种与b表的险种相同,并且a表的车牌,发动机号,车大架号与b表的车牌,发动机号,车大架号只要3个中的一个相同,则显示出来相同的记录。
不相同的咋整呢
这么说吧,一辆 车牌为 吉B3120 挂的车 在日上了险种为DAA,DZA两种险,截止到日,当时还不知道发动机号或者车大架号,也可能还为上牌,但是车牌,发动机号,大架号肯定有一项是填了的
到日又开始续保,还是DAA,DZA两种险,这回有大架号了,就把大架号填上了。
我要查询的就是日上险了 到日看看续保没有 不知道我说的清楚没
问题补充:这么说吧,一辆 车牌为 吉B3120 挂的车 在日上了险种为DAA,DZA两种险,截止到日,当时还不知道发动机号或者车大架号,也可能还为上牌,但是车牌,发动机号,大架号肯定有一项是填了的
到日又开始续保,还是DAA,DZA两种险,这回有大架号了,就把大架号填上了。
我要查询的就是日上险了 到日看看续保没有 不知道我说的清楚没
a表是日
b表是日
问题补充:kidding87 写道主要是你这个无字
select * from a,b where a.xianzhong=b.xianzhong and (
(a.chepai=b.chepai and a.chepai !='无') or
(a.fadongji = b.fadongji and a.fadongji!='无')
(a.chejiahao=b.chejiahao and a.chejiahao!='无')
你这个条件根本没用啊
采纳的答案
SELECT a.xianzhong,
WHEN a.chepai IN ('暂未上牌','')
THEN b.chepai
ELSE a.chepai
AS chepai,
WHEN a.fadongji IN ('无','')
THEN b.fadongji
ELSE a.fadongji
AS fadongji,
WHEN a.chejiahao IN ('无','')
THEN b.chejiahao
ELSE a.chejiahao
AS chejiahao
FROM a,b WHERE a.xianzhong=b.xianzhong
AND( (a.chepai=b.chepai AND a.chepai!='无' AND a.chepai!='') OR (a.fadongji=b.fadongji AND a.fadongji!='无' AND a.fadongji!='') OR (a.chejiahao=b.chejiahao AND a.chejiahao!='无' AND a.chejiahao!=''))
上面是我的。。写的有点错了。。改下
另外,select distinct b.*&&
& from a&&
where a.xianzhong = b.xianzhong& and( a.chepai = b.chepai or a.fadongji = b.fadongji or
&&&&&& a.chejiahao = b.chejiahao)&
这们兄弟写的。。你把a表中的任意一个fadongji改成不是无。。你就错了。。可以试下,distinct不能合并'无'字的
少写了个'!'
select b.*
from a left join b on(a.xianzhong=b.xianzhong)
where (a.chepai=b.chepai and (a.chepai!='暂未上牌' or b.chepai!='暂未上牌'))
OR (a.fadongji=b.fadongji and (a.fadongji!='无' or b.fadongji!='无'))
OR (a.chejiahao=b.chejiahao and (a.chejiahao!='无' or b.chejiahao!='无' ))
group by b.chepai,b.fadongji,b.chejiahao,b.xianzhong
没有oracle,也没有mysql ,在sqlserver下测试下,
select b.*
from a left join b on(a.xianzhong=b.xianzhong)
where (a.chepai=b.chepai and (a.chepai!='暂未上牌' or b.chepai!='暂未上牌'))
OR (a.fadongji=b.fadongji and (a.fadongji!='无' or b.fadongji!='无'))
OR (a.chejiahao=b.chejiahao and (a.chejiahao='无' or b.chejiahao='无' ))
group by b.chepai,b.fadongji,b.chejiahao,b.xianzhong
不知道楼主是否要这样的结果,Oracle的,自己看看mysql怎么用:
1将“无”当空处理:
SELECT DISTINCT b.*
& FROM a, b
WHERE b.xianzhong = a.xianzhong
&& AND ((nvl(a.chepai, '无') = nvl(b.chepai, '无')) OR (nvl(a.fadongji, '无') = nvl(b.fadongji, '无')) OR
&&&&&& (nvl(a.chejiahao, '无') = nvl(b.chejiahao, '无')))
2“无”和空不一样:&&&&&
SELECT DISTINCT b.*
& FROM a, b
WHERE b.xianzhong = a.xianzhong
&& AND ((nvl(a.chepai, '') = nvl(b.chepai, '')) OR (nvl(a.fadongji, '') = nvl(b.fadongji, '')) OR
&&&&&& (nvl(a.chejiahao, '') = nvl(b.chejiahao, '')))
select distinct b.* from a, b where b.xianzhong = a.xianzhong and (
(a.chepai = b.chepai) OR
(a.fadongji = b.fadongji) OR
(a.chejiahao = b.chejiahao)
加个distinct去重复记录
select b.* from a,b where a.xianzhong=b.xianzhong and a.chepai=b.chepai and a.chepai!='无' and a.chepai!='';
select b.* from a,b where a.xianzhong=b.xianzhong and a.fadongji=b.fadongji and a.fadongji!='无' and a.fadongji!='';
select b.* from a,b where a.xianzhong=b.xianzhong and a.chejiahao=b.chejiahao and a.chejiahao!='无' and a.chejiahao!='';
效率不是很好,也许能实现你的功能
楼上的和我写的一样的。。。
看来oracle带的函数还是比较好用的。。
建议什么“无” 这些都update 为null判断起来舒服多了
SELECT a.xianzhong,
CASE a.chepai WHEN '暂未上牌' OR ''
THEN b.chepai
ELSE a.chepai
AS chepai,
CASE a.fadongji WHEN '无' OR ''
THEN b.fadongji
ELSE a.fadongji
AS fadongji,
CASE a.chejiahao WHEN '无' OR ''
THEN b.chejiahao
ELSE a.chejiahao
AS chejiahao
FROM a,b WHERE a.xianzhong=b.xianzhong
AND( (a.chepai=b.chepai AND a.chepai!='无' AND a.chepai!='') OR (a.fadongji=b.fadongji AND a.fadongji!='无' AND a.fadongji!='') OR (a.chejiahao=b.chejiahao AND a.chejiahao!='无' AND a.chejiahao!=''))
能实现你要的功能,,但是你这个表。。没有的字段,有的是无,有的是''。这种写法太恶心了吧
这个sql可以满足你需要的结果:分数拿来,哈哈!
select distinct b.*&&
& from a&&
where a.xianzhong = b.xianzhong& and( a.chepai = b.chepai or a.fadongji = b.fadongji or&
&&&&& a.chejiahao = b.chejiahao)&
select b.*&&
& from a&&
where a.xianzhong = b.xianzhong& and( a.chepai = b.chepai or a.fadongji = b.fadongji or&
&&&&& a.chejiahao = b.chejiahao)&
不会吧,最多没过滤字段,那你看看这个,不过我用的oracle写的,不知道mysql支持不
select a.xianzhong
as xianzhong,
nvl(a.chepai,b.chepai)
nvl(a.fadongji,b.fadongji)
as fadongji,
nvl(a.chejiahao,b.chejiahao) as chejiahao
where a.xianzhong = b.xianzhong
and ((a.chepai = b.chepai and a.chepai != '无') or
(a.fadongji = b.fadongji and a.fadongji != '无') or
(a.chejiahao = b.chejiahao and a.chejiahao != '无'))
主要是你这个无字
select * from a,b where a.xianzhong=b.xianzhong and (
(a.chepai=b.chepai and a.chepai !='无') or
(a.fadongji = b.fadongji and a.fadongji!='无')
(a.chejiahao=b.chejiahao and a.chejiahao!='无')
哥哥,我就想问,你的结果到底要算的是什么。
只要a表的险种与b表的险种相同,并且a表的车牌,发动机号,车大架号与b表的车牌,发动机号,车大架号只要3个中的一个相同,则显示出来相同的记录。
不相同的咋整呢
我咋说,我做了半天也不知道你的结果怎么来的
他的这个不知道你用mysql运行过结果没
我没有mysql,用的oracle
应该就是下面的这个意思
select b.*
left join b
on a.xianzhong = b.xianzhong
where (a.chepai = b.chepai) or (a.fadongji = b.fadongji) or
(a.chejiahao = b.chejiahao)
这个结果是怎么得到的呢?
想了半天也不知道楼主要的是什么结果。。。
已解决问题
未解决问题MySQL数据库将多条记录的单个字段合并成一条记录
MySQL将多条记录的单个字段合并成一条记录
MySQL数据库将多条记录的单个字段合并成一条记录的操作是本文
我们主要要介绍的内容,接下来就让我们一起来了解一下这部分内容吧。
测试用表结构: & &
CREATE TABLE IF NOT EXISTS `tet` ( &
& `id` int(11) NOT NULL, &
& `name` varchar(255) NOT NULL, &
& `url` varchar(255) NOT NULL &
) ENGINE=InnoDB DEFAULT CHARSET=utf8;&
转存表中的数据 `tet`
INSERT INTO `tet` (`id`, `name`, `url`) VALUES &
(1, '百度', ''), &
(0, 'google', '.hk'), &
(3, '400电话', '');&
SELECT GROUP_CONCAT ( name ) name &
FROM tet &
WHERE 11 = 1 &
LIMIT 0 , 30&
name 百度,google,400电话。
GROUP_CONCAT还可以用SEPARATOR &关键词指定连接符,sql语句如下:
SELECT GROUP_CONCAT ( url SEPARATOR & @ & ) url &
FROM tet &
WHERE 11 = 1 &
LIMIT 0 , 30&
SELECT GROUP_CONCAT ( name ) name &
FROM tet &
WHERE 11 = 1 &
GROUP BY id &
LIMIT 0 , 30&
1.测试语句:SELECT group_concat(town) FROM `players` group by town
结果去查找town中去查找哪些值是一样的,如果相等,就全部列出来,
以逗号分割进行列出,如下:
group_concat(town)
2.测试:SELECT group_concat( town )
FROM players
group_concat(town)
长沙,北京,北京,
上面可以证明,group_concat只有与group by语句同时使用才能产生效果
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'}

我要回帖

更多关于 mysql 修改字段类型 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信