SQLite多对多选择

时间:2017-12-09 17:00:51

标签: android sql sqlite many-to-many android-sqlite

我正在尝试从我的android sqlite数据库中选择数据。我有3个桌子 - 桌面玩家(所有玩家的列表),表格匹配(所有匹配的列表)和表格PlayersMatches(每个匹配中的玩家列表,创建多对多的关系)。我想编写SELECT命令,它返回所有匹配,其中两个玩家一起玩。这是一个小例子:

Table PLAYERS
-------------
id    name
1     John
2     Jamie
3     Joe

Table MATCHES
-------------
id    date
1     17/12/01
2     17/12/02
3     17/12/03

Table PLAYERS_MATCHES
---------------------
id    id_Player    id_Match
1     1            1
2     2            1
3     1            2
4     3            2
5     1            3
6     2            3

所以,我想编写select命令,返回所有匹配,其中扮演John(1)和Jamie(2)。结果应该是:

SELECT RETURNED
-------------
id_match
1
3

请注意,每场比赛可以有超过2名球员。

可以编写单个sql命令,或者我应该以不同的方式执行它? (例如,为第一个玩家选择命令,为第二个玩家选择另一个,在Android过滤器中以编程方式匹配)。

1 个答案:

答案 0 :(得分:1)

在单个sql中完成它是完全可以的。这是为SQL构建的查询类型。

你在PlayerMatches表上执行self join,如:

SELECT distinct M1.id_match
From PLAYERS_MATCHES M1 CROSS JOIN PLAYERS_MATCHES M2  
WHERE M1.id_match=M2.id_match AND M1.id_player=1 AND M2.id_player=2

验证

sqlite> select * from matches;
id          p           m
----------  ----------  ----------
1           1           1
2           2           1
3           1           2
4           3           2
5           1           3
6           2           3
sqlite>

sqlite> select distinct m1.m from matches m1 cross join matches m2
   ...> where m1.m=m2.m and m1.p=1 and m2.p=2;
m
----------
1
3
sqlite>