0

我正在尝试查找名为“Jack”的玩家的 ID 以及他们玩过的游戏数量:

Select p.id, count(*) as numOfGamePlayed
from player p, game g
where p.name = 'Jack' and p.id = g.id
group by p.id;

问题是,这只会列出至少玩过一场游戏的名为 Jack 的玩家。我怎样才能列出那些没有玩过任何游戏的人?

编辑:对于那些玩家,numOfGamePlayed 必须为 0。如果我这样做

Select p.id, count(*) as numOfGamePlayed
from player p LEFT JOIN game g ON p.id = g.id
where p.name = 'Jack'
group by p.id;

没有玩过任何游戏的人仍然会显示 numOfGamePlayed 为 1

4

4 回答 4

4

停止对初学者使用隐式连接。这无论如何都是一个坏习惯。然后你可以这样做:

Select p.id, count(g.id) as numOfGamePlayed
from player p
LEFT JOIN game g
 ON p.id = g.id
where p.name = 'Jack'
group by p.id;
于 2013-03-14T16:19:30.573 回答
0

您需要玩家和游戏之间的外部连接

SELECT p.ID, 
  COUNT(*) AS numOfGamePlayed
FROM player p
LEFT OUTER JOIN game g
ON p.id = g.id
WHERE p.name = 'Jack'
GROUP BY p.ID;
于 2013-03-14T16:18:55.903 回答
0
SELECT p.id, count(*) as numOfGamePlayed
FROM player p
LEFT JOIN game g ON g.id = p.id
WHERE p.name = 'Jack'
--AND g.id IS NULL
GROUP BY p.id;
于 2013-03-14T16:19:11.060 回答
0

你必须做 count(game.PlayerId) 而不是 count(*)

在此处查看 SQL Fiddle 演示

select p.PNAME, g.gameplayed
from player p 
left outer join game g
ON p.pid = g.pid;

Select p.pid, count(g.pid) as numOfGamePlayed
from player p 
LEFT JOIN game g 
ON p.pid = g.pid
where p.pname = 'Jack'
group by p.pid;
于 2013-03-14T16:53:17.753 回答