#sql #database #relational-database
#sql #База данных #реляционная база данных
Вопрос:
Мне нужна помощь с SQL-запросом
У меня есть эта таблица
likes
friend friend2
1 2
2 1
3 1
4 5
Мне нужно выбрать только одну пару друзей, которые нравятся друг другу.
С моим текущим выбором я получаю это
id name id name
1709 Cassandra 1689 Gabriel
1689 Gabriel 1709 Cassandra
1501 Jessica 1934 Kyle
1934 Kyle 1501 Jessica
но ожидаемый результат запроса:
id name id name
1709 Cassandra 1689 Gabriel
1501 Jessica 1934 Kyle
Комментарии:
1. Какую базу данных и версию вы используете?
Ответ №1:
Если вы уверены, что каждая пара вводится в базу данных дважды (один раз как A, B и снова как B, A), то вы можете использовать это:
SELECT friend, friend2
FROM yourtable
WHERE friend < friend2
Если могут быть некоторые пары, которые вводятся только один раз, тогда вы можете использовать это:
SELECT DISTINCT
LEAST(friend, friend2) AS friend,
GREATEST(friend, friend2) AS friend2
FROM yourtable
Ответ №2:
Попробуйте что-то вроде этого:
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
Результатом запроса являются все друзья, которые дружат друг с другом.