Попробуйте что-то вроде этого:
select *
from
(
select
case
when id1 > id2 then id2
when id1 < id2 then id1
end as Friend1,
case
when id1 < id2 then id2
when id1 > id2 then id1
end as Friend2
from TestMatching
) a
group by Friend1, Friend2
Что здесь происходит, так это то, что он использует подзапрос, а подзапрос - это всего лишь пара CASE
блоков для упорядочения дружбы. И затем это делает группу, чтобы создать сводку дружеских отношений. Если бы вы хотели увидеть, какие друзья ОБА оба пути, то вы бы сделали что-то вроде этого:
select *
from
(
select
case
when id1 > id2 then id2
when id1 < id2 then id1
end as Friend1,
case
when id1 < id2 then id2
when id1 > id2 then id1
end as Friend2
from TestMatching
) a
group by Friend1, Friend2
having COUNT(*) > 1 -- this is the added clause to get consenting friends
Результатом запроса являются все друзья, которые дружат друг с другом.