В настоящее время я пытаюсь перенести таблицу старых грязных «дружбы» в новую, но у меня есть проблема с переходом ее данных.Исключить «зеркальные строки»
старая таблица 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;
Спасибо большое!Я думал, что неважно, какой пользователь user1 и user2, но, подумав еще раз, это так. Я приспособию его для своего дела. ура – Nikola