выберите строку, в которой столбец 2 не равен столбцу 1

#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
  

Результатом запроса являются все друзья, которые дружат друг с другом.