排除'镜像'行

时间:2015-07-16 11:40:12

标签: mysql sql

我目前正在尝试迁移旧的肮脏友谊'表到一个新表,但我的数据转换有问题。

旧表格为hotlist

id int(11) AI PK 
id_user int(11) 
id_friend int(11) 
accepted enum('0','1','2','3','9') 
date_sent timestamp 
date_accepted timestamp 
rejected tinyint(1)

我迁移的新邮件是friends

user1 int(11) 
user2 int(11) 
status enum('0','1','2') 
date timestamp

新表的status列(' 0',' 1'' 2')尊重请求是&# 39;等待','接受'或者'拒绝'。

所以我已经开始迁移'待处理的请求:

INSERT INTO friends(user1, user2, status, date)
    SELECT id_user, id_friend, '0', date_sent
    FROM hotlist
    WHERE accepted='0' AND rejected=0;

好的,这很明显。

接下来,'拒绝' 请求。由于我需要计算它们,我只是以相同的方式将它们全部转移:

INSERT INTO friends(user1, user2, status, date)
    SELECT id_user, id_friend, '2', date_sent
    FROM hotlist
    WHERE accepted='0' AND rejected=1

这一切也很好。

现在,我的困难在于'已接受' 请求。来自旧表的样本数据(仅相关部分):

| id_user  |  id_friend |  accepted  | ...
|    1     |     2      |      1     | ... 
|    2     |     1      |      1     | ... 
|    1     |     3      |      1     | ... 
|    3     |     1      |      1     | ... 

正如你可以看到每一个友谊行,有一个镜像'两个用户都有一个。我不要想要这个" double"新表中的数据。我无法在" request-accept / deny"中看到这样做的目的。友谊系统,如果我错了,请纠正我。

所以我想从旧表中传输的是每个友谊中只有两行。这就是它的样子:

| id_user  |  id_friend |  accepted  | ...
|    1     |     2      |      1     | ... 
|    1     |     3      |      1     | ... 

最后一件事。当用户接受请求时,镜像行被创建并且#34;当它们具有date_accepted=date_sent时。我已经告诉过自己了 - "嘿,真的"真的"请求在被发送的同时被接受" - 但情况并非如此,有十几个,所以下面的查询给了我想要的东西,除了那些立即被接受的。

SELECT id_user, id_friend, date_accepted
    FROM hotlist
    WHERE accepted='1' AND date_sent!=date_accepted;

1 个答案:

答案 0 :(得分:0)

您可以将用户的ID与好友的ID进行比较并将其切换,以便始终排在最前面,然后使用group by消除重复项。假设您想要最早的日期,可以将min()应用于日期列。

这应该有效:

insert into friends (user1, user2, status, date)

select 
    case when id_user < id_friend then id_user else id_friend end id_user,
    case when id_user > id_friend then id_user else id_friend end id_friend,
    accepted, 
    min(date_accepted) date_accepted
from hotlist
where accepted = '1'
group by 
    case when id_user < id_friend then id_user else id_friend end,
    case when id_user > id_friend then id_user else id_friend end,
    accepted

这会使用户ID较低的用户1和用户ID较高的用户2,但看到您从用户/朋友模型更改为用户/用户,我认为哪个用户成为user1可能无关紧要。