Php 删除不同列上的相同值行
我被困在一个非常基本的问题上,我想跳过在三列上有重复值的行 进餐Php 删除不同列上的相同值行,php,mysql,Php,Mysql,我被困在一个非常基本的问题上,我想跳过在三列上有重复值的行 进餐 id,type,user_id,friend_id,date 1, 'friend', 4 , 5 , 5/5/2010 2, 'friend', 5 , 4 , 5/5/2010 现在,数据就是这样保存的(我无法更改保存模块) 因为两者都有相同的东西,所以我只想把它们选为1行,而不是2行。 我不想在PHP端验证和删除它,b/c如果我在PHP端验证和删除它,那么分页将受到干扰 编辑: 表结构 create table `feed
id,type,user_id,friend_id,date
1, 'friend', 4 , 5 , 5/5/2010
2, 'friend', 5 , 4 , 5/5/2010
现在,数据就是这样保存的(我无法更改保存模块)
因为两者都有相同的东西,所以我只想把它们选为1行,而不是2行。
我不想在PHP端验证和删除它,b/c如果我在PHP端验证和删除它,那么分页将受到干扰
编辑:
表结构
create table `feed` (
`id` double ,
`type` blob ,
`user_id` double ,
`type_id` double ,
`date` datetime
);
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('78','friends','1314','1313','2012-09-03 19:48:14');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('79','friends','1313','1314','2012-09-03 19:48:14');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('80','friends','1314','1312','2012-09-03 19:49:07');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('82','friends','1313','1312','2012-09-03 19:49:09');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('84','friends','1315','1312','2012-09-03 19:49:24');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('86','friends','1315','1313','2012-09-03 19:49:33');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('87','friends','1313','1315','2012-09-03 19:49:33');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('97','friends','1317','1312','2012-09-03 19:55:06');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('99','friends','1313','1317','2012-09-03 19:56:01');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('100','friends','1317','1313','2012-09-03 19:56:01');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('101','friends','1315','1317','2012-09-03 19:56:58');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('102','friends','1317','1315','2012-09-03 19:56:58');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('104','following','1313','1193','2012-09-03 19:59:39');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('105','following','1313','1308','2012-09-03 19:59:51');
insert into `feed` (`id`, `type`, `user_id`, `type_id`, `date`) values('106','following','1313','1098','2012-09-03 19:59:58');
您要查找的函数是DISTINCT()。这允许您按该列对表进行分组并删除重复项 只需确保在select语句中也选择了其他字段列: 从TABLENAME中选择
id
、DISTINCT(type
)、user\u id
、friend\u id
、date
您可以对表本身执行
JOIN
,这应该满足您的需要。
像这样的事情可能会奏效:
SELECT * FROM tableName a
JOIN tableName b ON a.user_id = b.friend_id
您应该通过运行以下命令来清除这些重复记录:
DELETE FROM table t1 WHERE
EXISTS (
SELECT * FROM table t2
WHERE t1.type=t2.type AND t1.date=t2.date
AND t2.user_id = t1.friend_id AND t2.friend_id = t1.user_id
AND t1.user_id > t2.user_id
)
然后,您可以通过以下方式获得清晰的友谊记录:
SELECT DISTINCT type, user_id, friend_id, date FROM table
此外,您还可以编写一个在INSERT时触发的DB触发器,用于检查是否已经存在重复的(具有反向的用户id和朋友id)。如果存在,它会回滚,否则允许插入。这是最终的解决方案!如果存在相同的友谊对(反向),则只接受用户id>朋友id的友谊对
SELECT DISTINCT type, user_id, friend_id, date
FROM table t1
WHERE t1.user_id > t1.friend_id
OR NOT EXISTS (
SELECT * FROM table t2
WHERE t1.type=t2.type AND t1.date=t2.date
AND t2.user_id = t1.friend_id AND t2.friend_id = t1.user_id
)
是否要删除相同的友谊记录?(就像在给定的记录中,“5是4的朋友”意味着“4是5的朋友”)是的,我想消除相同的友谊值,b/c 4->5和5->4是相同的。如果答案解决了您的问题,请单击绿色按钮将其标记为已接受。@Zar yes会这样做,但让我尝试一下,以他的例子为例,
user_id
在两行中不相等,因此它们不会像他所希望的那样与您的代码“合并”?不,这种区别在这种情况下不起作用,当我运行query@Zar时,它会获取一个用户id。@maginvegeta:Hm。。。您可能需要在WHERE和ORDER子句之间添加GROUP BYtype
。这不起作用。它甚至不采用不同的类型
和日期
列。