2015-07-16 2 views
0

В настоящее время я пытаюсь перенести таблицу старых грязных «дружбы» в новую, но у меня есть проблема с переходом ее данных.Исключить «зеркальные строки»

старая таблица 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') новой таблицы с уважением указывает, что запрос «ожидает», «принят» или «отклонен».

Так что я начал с миграцией 'в ожидании' запросов:

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  | ... 

Как вы можете видеть каждую строку дружбы, имеет «зеркальный» один для обоих пользователей. I НЕ хочу эту «двойную» информацию в новой таблице. Я не вижу цели сделать это в системе дружбы «прием-прием/отказ», пожалуйста, поправьте меня, если я ошибаюсь.

Так что я бы хотел перевести со старого стола только одна из двух строк за дружбу. Вот как это было бы выглядеть:

Последняя вещь. Зеркальные строки были созданы «искусственно», когда пользователь принял запрос, поэтому они имеют date_accepted=date_sent. Я сказал себе: «Эй, совершенно невозможно, чтобы« реальный »запрос принимался одновременно с отправкой», но это не тот случай, есть дюжина, поэтому следующий запрос дает мне то, что я хотите, кроме тех, которые принимаются немедленно.

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

ответ

0

Вы можете сравнить идентификатор пользователя с идентификатором друга и переключить их вокруг так, что самый низкий всегда приходит первым, а затем использовать группу, для устранения дубликатов. Предполагая, что вам нужна самая ранняя дата, вы можете применить 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 

Это сделало бы пользователь нижней user1 ид и один с более высоким user2 ид, но, видя, что вы изменили с пользователем/друг модели для пользователя/потребителя I будет думать, что не имеет значения, какой пользователь станет пользователем1.

+0

Спасибо большое!Я думал, что неважно, какой пользователь user1 и user2, но, подумав еще раз, это так. Я приспособию его для своего дела. ура – Nikola