Mysql 聚合子查询或联接中的计数

Mysql 聚合子查询或联接中的计数,mysql,join,subquery,aggregate-functions,Mysql,Join,Subquery,Aggregate Functions,我有两个表来定义游戏细节:一个包含游戏的表和一个包含移动的表 我知道该轮到谁了 SELECT (COUNT(idx) %2) FROM history WHERE gameID=x 结果=1时为白色,结果=0时为黑色 现在我想选择一个特定的系列游戏,这是我的行动 不知道我在游戏中是白人还是黑人 因此,现在我使用另一个查询: SELECT g.gameID FROM games AS g WHERE (g.whitePlayer = 2 or (g.blackPlayer = 2) 然后我使

我有两个表来定义游戏细节:一个包含游戏的表和一个包含移动的表

我知道该轮到谁了

SELECT (COUNT(idx) %2) FROM history WHERE gameID=x
结果=1时为白色,结果=0时为黑色

现在我想选择一个特定的系列游戏,这是我的行动

不知道我在游戏中是白人还是黑人

因此,现在我使用另一个查询:

SELECT g.gameID 
FROM games AS g
WHERE (g.whitePlayer = 2 or (g.blackPlayer = 2)
然后我使用gameID查看这是否是我的动作。如果没有,那我就跳过那场比赛

我想将这两者结合起来,我试图创建一个聚合子集,但由于计数问题,未能成功

例如,这不起作用且不返回任何内容:

SELECT * 
FROM games as g 
WHERE (g.whitePlayer = 2) 
  AND gameID IN (SELECT gameID 
                 FROM history as h 
                 HAVING (COUNT(h.idx) %2) = 1)

有人知道如何解决这个问题吗

试试这个

 Select count(h.idx) , COUNT(h.idx) %2 
 From history as h
 Inner Join  games g
 On h.gameID = g.gameID 
 WHERE  whitePlayer=2
 HAVING  COUNT(h.idx) %2 = 1

我还没说完,但这回答了我自己的问题

SELECT g.gameID, (count(h.idx)%2) as lastmove
FROM games as g
  inner join history as h on g.gameID=h.gameID 
WHERE (g.whitePlayer=2)
GROUP by g.gameID, g.whitePlayer
HAVING (g.whitePlayer=2 AND lastmove=0)

更接近,但第一次计数返回whiteplayer=2的所有计数项目。我需要所有的比赛。如果您愿意,请选择h.gameID等。。这将只返回第一个合适的游戏。你能提供一把小提琴和你想要的结果吗?需要我移动的游戏中的所有gameID。啊哈,我昨天不明白,但你是指一把sqlfiddle!我在上创建了一个,请记住,自动增量只保证在表中是唯一的。不能保证它们是按顺序排序的,也不能保证它们永远不会重复使用。如果必须处理事务表上的回滚,则尤其如此:。没有提到数据库中的并发插入。
SELECT g.gameID, (count(h.idx)%2) as lastmove
FROM games as g
  inner join history as h on g.gameID=h.gameID 
WHERE (g.whitePlayer=2)
GROUP by g.gameID, g.whitePlayer
HAVING (g.whitePlayer=2 AND lastmove=0)