Mysql 返回列值多次出现的行的SQL查询

Mysql 返回列值多次出现的行的SQL查询,mysql,sql,database-design,Mysql,Sql,Database Design,我正在创建一个简单的数据库,它将允许我跟踪斯诺克的成绩,在球员之间产生正面对正面的成绩。目前我有3张桌子:(球员,赛程,结果) 我想要一个查询,它返回结果表中所有在玩家1和玩家3之间发生的装置的行。目前我的查询是: SELECT * FROM Result WHERE PlayerID IN (1,3); 这将返回结果表的前3行-当我只查找前2行时,因为它们共享相同的FixtureID。有没有一种简单的方法可以从这个查询结果中删除第三行,或者我应该重新考虑我的数据库设计?任何帮助都将不胜感激。

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

我想要一个查询,它返回结果表中所有在玩家1和玩家3之间发生的装置的行。目前我的查询是:

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
)

您可以连接fixtures表两次,如下所示:

select
  *
from
  Result as R1
  join Result as R2 on R1.FixtureID = R2.FixtureID
where
  R1.PlayerID in (1,3)
  AND R2.PlayerID in (1,3)
  AND R1.PlayerID != R2.PlayerID
group by
  R1.FixtureID
;
或者,因为它现在有点凌乱,所以像斯诺克分数显示一样显示:

select
  R1.FixtureID, R1.PlayerID as player1, R1.FramesWon as player1_frames, R1.FramesWon+R2.FramesWon as total_frames, R2.FramesWon as player2_frames, R2.PlayerID as player2
from
  Result as R1
  join Result as R2 on R1.FixtureID = R2.FixtureID
where
  R1.PlayerID in (1,3)
  AND R2.PlayerID in (1,3)
  AND R1.PlayerID != R2.PlayerID
group by
  R1.FixtureID
;

如果您想要的是“共享相同的
FixtureID
”的行,则不清楚为什么要选择
针对
PlayerID
。你能告诉我们更多关于你在功能上想要达到的目标吗?当然,我和我的朋友们经常打斯诺克,但现在我开始跟踪所有结果,这样我们就可以在特定的时间段内合计“帧数”,例如确定2015年谁赢得的帧数最多。因此,如果玩家1扮演玩家2,夹具的详细信息将存储在夹具表中,该表链接到结果表。所以我需要跟踪玩家1对玩家3的比赛结果,因此我需要查询玩家ID,但其中FixtureID也是相同的。谢谢-这正是我想要实现的。
select
  R1.FixtureID, R1.PlayerID as player1, R1.FramesWon as player1_frames, R1.FramesWon+R2.FramesWon as total_frames, R2.FramesWon as player2_frames, R2.PlayerID as player2
from
  Result as R1
  join Result as R2 on R1.FixtureID = R2.FixtureID
where
  R1.PlayerID in (1,3)
  AND R2.PlayerID in (1,3)
  AND R1.PlayerID != R2.PlayerID
group by
  R1.FixtureID
;