我正在创建一个简单的数据库,允许我跟踪斯诺克的结果,产生球员之间的直接结果。目前我有3张桌子:(球员,赛程,结果)

PlayerID    PlayerName
1           Michael Abraham
2           Ben Mullen
3           Mark Crozier

FixtureID   Date                 TableNo    Group
1           07/12/2015 19:00:00  12         0
2           08/12/2015 12:00:00  9          0

ResultID    FixtureID   PlayerID    FramesWon
1           1           1           3
2           1           3           1
3           2           1           5
4           2           2           1

我想要一个查询,它返回结果表中发生在玩家1和3之间的fixture的所有行。当前我的查询是:
SELECT *
FROM Result
WHERE PlayerID IN (1,3);

这将返回结果表的前3行-当我只查找前2行时,因为它们共享相同的FixtureID。有没有一种简单的方法可以从这个查询结果中删除第三行,或者我应该重新考虑我的数据库设计?任何帮助都将不胜感激。

最佳答案

一种解决方案是使用按查询分组、按FixtureID分组和计算每个FixtureID的行数。此查询将选择玩家1和3的所有FixtureID:

select
  FixtureID
from
  Results
where
  PlayerID IN (1,3)
group by
  FixtureID
having
  count(*)=2

然后,要从结果表中获取记录,可以使用以下查询:
select *
from Results
where FixtureID IN (
  select FixtureID
  from Results
  where PlayerID IN (1,3)
  group by FixtureID
  having count(*)=2
)

10-06 06:16