如何从mysql查询中消除重复记录

时间:2014-04-04 07:38:18

标签: mysql performance join inner-join outer-join

我有一个应用程序,我必须显示用户的活动。关于重复录入/活动,我面临一个问题。首先,我描述了我的架构:

表:UserFriends

CREATE TABLE `testDb`.`UserFriends` (
  `Pk` INT NOT NULL AUTO_INCREMENT,
  `Userid` INT NULL,
  `Friendid` INT NULL,
  PRIMARY KEY (`Pk`));

表:UserActivities

CREATE TABLE `testDb`.`UserActivities` (
  `Pk` INT NOT NULL AUTO_INCREMENT,
      `Userid` INT NULL,
  `Friendid` INT NULL,
  `ActivityType` TINYINT(1) NULL,
  PRIMARY KEY (`Pk`));

将一些虚拟数据插入表中。

INSERT INTO UserFriends(Userid, friendid )
values (7,105), (7,92)  

INSERT INTO UserActivities(Userid, friendid )
values (92, 1054), (105,2014), (92,105) 

我在UserFriends表中有一个用户(pk-7)和2个朋友(例如id no(s)105& 92)。有一些活动由用户(例如,7)及其朋友完成。用户92已经成为用户1054的朋友,用户105已经将用户2014添加为朋友并且用户92和用户105也成为朋友。现在我必须向用户7展示他/她的活动。我创建了一个查询,该查询对用户自己以及所有朋友的所有活动都进行了罚款。这是查询:

select ua.pk activityid, 
    if(uf.Friendid = ua.userid, ua.userid, ua.Friendid) myfriend,       
    if(uf.Friendid = ua.Friendid, ua.Friendid, ua.Userid) friend_of_friend
from UserFriends uf 
inner join UserActivities ua on uf.Friendid = if(uf.Friendid = ua.userid, ua.userid, ua.Friendid)
where uf.userid = 7

我的结果如下:

activityid,   myfriend,   friend_of_friend
1,            92,         1054
2,            105,        2014
3,            105,        92
3,            92,         105

请仔细检查结果,由于加入,活动ID 3会有重复记录。用户7有两个朋友(例如92,105),所以它来了两次。我只想要一个记录。我不知道如何删除/删除此记录。我的原始查询有6-7表连接, 活动 表有大约600000条记录, 用户友情 表大约有200000条记录。所以我也要考虑表现。 请有人帮我解决这个问题。 谢谢。

2 个答案:

答案 0 :(得分:1)

尝试添加GROUP BY activityid

像那样:

    where uf.userid = 7
    GROUP BY activityid

答案 1 :(得分:0)

您可以查看此查询

select DISTINCT ua.pk activityid, 
    if(uf.Friendid = ua.userid, ua.userid, ua.Friendid) myfriend,       
    if(uf.Friendid = ua.Friendid, ua.Friendid, ua.Userid) friend_of_friend
from UserFriends uf 
inner join UserActivities ua on uf.Friendid = if(uf.Friendid = ua.userid, ua.userid, ua.Friendid)
where uf.userid = 7

我在ua.pk之前使用了一个不同的关键字。

参考:http://www.w3schools.com/sql/sql_distinct.asp