2016-11-14 17 views
3

セイtheoritcally我々は(いくつかのテストデータとの)試合にテーブルを求めている:SQLで相互Tinderマッチングを選択する方法は?

create table matches (
    user_id int, 
    target_id int 
); 
INSERT INTO matches VALUES (1,2); 
INSERT INTO matches VALUES (2,1); 
INSERT INTO matches VALUES (3,5); 
INSERT INTO matches VALUES (4,1); 
INSERT INTO matches VALUES (1,4); 
INSERT INTO matches VALUES (5,3); 
INSERT INTO matches VALUES (5,4); 
INSERT INTO matches VALUES (4,5); 
INSERT INTO matches VALUES (1,3); 
INSERT INTO matches VALUES (1,5); 
INSERT INTO matches VALUES (6,1); 
INSERT INTO matches VALUES (6,2); 
INSERT INTO matches VALUES (6,3); 
INSERT INTO matches VALUES (6,4); 
INSERT INTO matches VALUES (6,5); 
INSERT INTO matches VALUES (6,6); // me_irl 

したがって、このテストデータセットのために、我々は以下の相互のThe Tinderの試合を期待してください:

1,2 
4,1 
5,3 
5,4 

どのように私は希望SQLでこれを選択しますか?これは、どのようなSQLクエリが返すある

select A.user_id A, B.user_id B from 
matches as A 
inner join 
matches as B 
on A.user_id = B.target_id 
where A.user_id = B.target_id 
and B.user_id = A.target_id 

A B 
1 2 
1 4 
2 1 
3 5 
4 1 
4 5 
5 3 
5 4 
+1

あなたが重複(すなわち、1,4と4,1)を排除するべき 'A FDavidov

答えて

2

"a.user_id < b.user_id"を追加することで、重複を除外で​​きます。このよう

select A.user_id A, B.user_id B from 
matches as A 
inner join 
matches as B 
on A.user_id = B.target_id 
where A.user_id = B.target_id 
and B.user_id = A.target_id 
and a.user_id < b.user_id 
+0

私はこのソリューションが気に入っていますが、ケースを使用するよりも理解しやすいです – Bill

1
select distinct case when A.user_id<B.user_id then A.user_id else B.user_id end as colum1, case when A.user_id<B.user_id then B.user_id else A.user_id end as colum2 from 
    matches as A 
    inner join 
    matches as B 
    on A.user_id = B.target_id 
    where A.user_id = B.target_id 
    and B.user_id = A.target_id 

はこれを試してみてくださいここで私は働くが、選択重複を得たものです。私はチェックしていない。うまくいきたいです

関連する問題