【发布时间】:2014-04-04 07:38:17
【问题描述】:
我有一个应用程序,我必须在其中显示用户的活动。我面临一个关于重复条目/活动的问题。首先我描述了我的架构:
表:UserFriends
CREATE TABLE `testDb`.`UserFriends` (
`Pk` INT NOT NULL AUTO_INCREMENT,
`Userid` INT NULL,
`Friendid` INT NULL,
PRIMARY KEY (`Pk`));
表:用户活动
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 个表连接,activity 表有大约 600000 条记录,userfriend 表大约有 200000记录。所以我也必须考虑性能。 请任何人都可以帮助我解决这个问题。 谢谢。
【问题讨论】:
-
你应该使用
DISTINCT。 -
哪些“重复”行是错误的?
-
你想要这样吗[sqlfiddle.com/#!2/edce6/4]来源来自
echo_Me和DISTINCT来自建议[sqlfiddle.com/#!2/edce6/6]
标签: mysql performance join inner-join outer-join