我目前正在尝试迁移旧的肮脏友谊'表到一个新表,但我的数据转换有问题。
旧表格为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;
答案 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可能无关紧要。