Я думаю, что вы хотите least()
и greatest()
- если ваша база данных поддерживает их:
select
least(s.sender_id, r.receiver_id) a,
greatest(s.sender_id, r.receiver_id) b,
count(*) frequency
from senders s
inner join receivers r on r.email_id = s.email_id
group by least(s.sender_id, r.receiver_id), greatest(s.sender_id, r.receiver_id)
order by frequency desc
В SQLite эквивалентными функциями являются min()
и max()
:
select
min(s.sender_id, r.receiver_id) a,
max(s.sender_id, r.receiver_id) b,
count(*) frequency
from senders s
inner join receivers r on r.email_id = s.email_id
group by min(s.sender_id, r.receiver_id), max(s.sender_id, r.receiver_id)
order by frequency desc
Демонстрация на DB Fiddle :
a | b | frequency
-: | --: | --------:
80 | 87 | 3
80 | 185 | 2
80 | 232 | 1
Если вы хотите фильтровать только по кортежам, имеющим двустороннюю связь, Вы можете добавить предложение having
к запросу:
select
min(s.sender_id, r.receiver_id) a,
max(s.sender_id, r.receiver_id) b,
count(*) frequency
from senders s
inner join receivers r on r.email_id = s.email_id
group by min(s.sender_id, r.receiver_id), max(s.sender_id, r.receiver_id)
having min(s.sender_id) <> max(s.sender_id)
order by frequency desc