2016-06-17 4 views
1

У меня есть таблица, называемая LIKES, следующим образом.Как избежать дубликатов в следующем сценарии SQL

enter image description here

Как вы можете видеть, что это имеет две колонки. UserName1, UserName2. Эта таблица содержит то, что, если один человек следует за другими лицами facebook page и т. Д.

Например, если Джон следует за страницей bobs, то есть запись в таблице, как Jon, bob, If bob следует за страницей Jon facebook, то есть запись под названием Боб, Джон.

Поэтому я хочу узнать всех пользователей, которые следуют за прочим профилями, и я хочу его без дубликатов.

У меня есть следующий запрос, который дает результаты поиска пользователей, которые следуют друг за другом. но я не в состоянии удалить дубликаты

SELECT L1.USERNAME1, L2.USERNAME2 
FROM LIKES L1, 
    LIKES L2 
WHERE L1.USERNAME1=L2.USERNAME2 
    AND L1.USERNAME2=L2.USERNAME1 

Окончательный вывод из данной таблицы должны быть Джон Боб, или Боб, Джон, а не оба.

мой запрос дает оба результата, как я могу удалить дубликаты в resluts

+3

Но он/она сделала обеспечит самую красочную таблицу, которую я видел сегодня. –

+0

@sstan, база данных mysql, я использовал https://sketch.io/sketchpad/ для создания образа :) – KItis

ответ

3

Во-первых, don't use comma-style joins. Этот синтаксис устарел в течение длительного времени. Во-вторых, одним из способов избежать дубликатов в этом случае является требование о том, чтобы первое имя, которое вы сообщаете в своем результирующем наборе, произошло до первого в алфавитном порядке. Вы можете сделать это безопасно, потому что любая пара имен, которые появятся в вашем результирующем наборе, должна появиться в исходной таблице в обоих порядках (например, («Боб», «Джон») и («Джон», «Боб»)). Я предполагаю, что вам не нужно иметь дело с случаем пользователя, который следует за своей страницей. Например:

select * 
from likes L1 
where 
    L1.username1 < L1.username2 and 
    exists (select 1 from likes L2 where L1.username1 = L2.username2 and L1.username2 = L2.username1); 

Результат:

username1 username2 
Bob  Jon 

Click here для SQL скрипку, который демонстрирует этот подход с использованием данных выборки.

2

Это выглядит немного странно, но это на самом деле работает:

select min(t.username1) as username1, 
     max(t.username2) as username2 
    from likes t 
group by least(t.username1, t.username2), 
     greatest(t.username1, t.username2) 
having count(distinct t.username1) = 2 

SQLFiddle

РЕДАКТИРОВАНИЕ Добавлена ​​пункт having, чтобы иметь дело с моим непониманием вопроса ФП в

+0

Умный, и он избегает моего предположения, что два имени отличаются друг от друга. :) –

+0

@sstan, ур ответ дает результат, на котором никто не следит за другими страницами facebook. Он должен давать только результаты A, следующие за B и B, следуют A, тогда результаты должны быть A, B или B, A не оба. Но если A следовать только B, но не наоборот, то он не должен появляться на выходе – KItis

+0

@Kltis: Ах, тогда я неправильно понял вопрос. Я думал, что вы хотите все строки без «логических» дубликатов. Тем не менее, это было интересное упражнение. – sstan

Смежные вопросы