查询不相交的集合

时间:2018-03-10 03:45:37

标签: sql

我已将所有DDL和查询放在

下面的sqlfiddel链接中

http://sqlfiddle.com/#!9/89c76/2

同样的事情

create table players(name varchar(32),playerid int);
insert into players values("a",1);
insert into players values("b",2);
insert into players values("c",3);
insert into players values("d",4);
insert into players values("e",5);
insert into players values("f",6);

select * from players;

create table matches(playerid int,game varchar(32));
insert into matches values(1,"game1");
insert into matches values(2,"game1");
insert into matches values(3,"game1");
insert into matches values(1,"game2");
insert into matches values(2,"game2");
insert into matches values(3,"game2");
insert into matches values(4,"game3");
insert into matches values(5,"game2");

select * from matches;

commit;

--This will give same players playing different games
select playerid,game
from matches
group by 1,2

现在说我要列出所有不玩特定游戏的玩家,比如说game1

  • 如果玩家1正在玩game1和game2,那么它不应该因为他还在而返回     和其他游戏一起玩game1,在这个例子中它应该返回玩家4和5
  • 如果在这种情况下玩家6中没有玩任何游戏的玩家,也应该返回     作为结果的一部分。

以下是我的疑问:

    select * from players 
where playerid not in (
    select playerid from matches m 
    where m.game = 'game1') /* 4,5,6*/

select * from players 
where playerid not in (
    select playerid from matches m 
    where m.game = 'game2') /*4,6*/   

select * from players 
where playerid not in (
    select playerid from matches m 
    where m.game = 'game3') /*1,2,3,5,6*/   

如何在所有游戏的单个查询中执行此操作?可以有许多类型的游戏。我无法明确指定游戏。相反,我想编写查询来获取所有不为每个游戏玩游戏的playerid,如下所示:

select * from players 
    where playerid not in (
        select playerid from matches m 
        group by game) 

以上查询仅提供一条记录。我需要这样的

Result:
------------------------
game1 | 4,5,6  
------------------------
game2 | 4,6
------------------------
game3 | 1,2,3,5,6
------------------------
....

我能够解决这个问题,发布解决方案,这样,对其他人有用

select p.playerid,m.game
from players p, (select distinct game from matches) m
where p.playerid not in (select playerid from matches where game=m.game)

我得到了正确的结果。可以进一步改进吗?

1 个答案:

答案 0 :(得分:0)

我认为单个子查询足以找到没有玩game1的玩家以及其他仍未玩任何游戏的玩家

select * from players 
where playerid not in (
    select p.playerid from players p 
    left join matches m on p.playerid = m.playerid 
    where m.game = 'game1')