Этот вопрос основан на не очень тривиальном вопросе How to remove two duplicate column. Я уже предложил решение по этому вопросу, но я думаю, что есть более подходящее и элегантное решение, чем у меня.Как правильно исключить строки со ссылками друг на друга?
Существует таблица сообщений с колонками msg_id
, from
, to
.
И у нас есть эти данные в нем:
msg_id from to
----------------
1 46 0
2 46 18
3 46 50
4 46 39
5 46 11
6 11 46
7 46 12
8 46 56
9 46 11
Мы должны исключить строки с разговорами, в которых имеется более одного сообщения (например, строки с msg_id = 5
, 6
и 9
) и в то же время необходимо оставить первую строку в выходе из этих строк. В общем выходе должно быть, как это (примечание: без msg_id = 6
и msg_id = 9
):
msg_id from to
----------------
1 46 0
2 46 18
3 46 50
4 46 39
5 46 11
7 46 12
8 46 56
Мое решение:
select distinct pm.`from`, pm.`to`
from `tsk_private_message` pm
left join
(select distinct pm.`from`, pm.`to`
from `tsk_private_message` pm
inner join `tsk_private_message` pm2
on (pm.`to` = pm2.`from`) and (pm2.`to` <> pm.`from`)) a
using (`from`, `to`)
where a.`from` is null;
Я просто искать ненужные строки из этих разговоров через подзапрос и «вычесть» результат основной стол. Как вы думаете? Есть ли более элегантное и более простое решение? Мне просто не нравится этот хитрый код.
Вот SQL Fiddle
[SQL Fiddle] (http://sqlfiddle.com/#!2/81ef4/20) как дополнение к ответу –