我已将所有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
以下是我的疑问:
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)
我得到了正确的结果。可以进一步改进吗?
答案 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')