【问题标题】:Count in aggregate subquery or join计数聚合子查询或连接
【发布时间】:2013-08-04 14:59:12
【问题描述】:

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

我可以通过

判断轮到谁了
SELECT (COUNT(idx) %2) FROM history WHERE gameID=x

result=1 为白色,result=0 为黑色。

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

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

所以现在我对游戏使用另一个查询:

SELECT g.gameID 
FROM games AS g
WHERE (g.whitePlayer = 2 or (g.blackPlayer = 2)

然后我使用游戏 ID 来查看是否是我的举动。如果没有,那我就跳过那场比赛。

我想将这两者结合起来,我尝试制作一个聚合子集但由于COUNT()而没有成功

例如这不起作用并且什么也不返回:

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)
FROM history as h
INNER JOIN
    (SELECT gameID
     FROM games 
     WHERE (whitePlayer = 2)) As thesegames ON h.gameID = thesegames.gameID 
HAVING (COUNT(h.idx) %2) = 1

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

http://sqlfiddle.com/#!2/425fb

【问题讨论】:

  • 请记住 auto_increment 只保证在表中是唯一的。不能保证它们是按顺序排序的,也不能保证从不重复使用。如果您必须处理事务表上的回滚,则尤其如此:sqlfiddle.com/#!2/2d39c/1。没有提到你的数据库中的并发插入。

标签: mysql join subquery aggregate-functions


【解决方案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)

【讨论】:

    【解决方案2】:

    试试这个

     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
    

    【讨论】:

    • 更接近,但第一个计数返回 whiteplayer=2 的所有计数项目。我需要所有的游戏。如果你会做 SELECT h.gameID 等。这将只返回第一个合适的游戏。
    • 你能提供一个小提琴和你想要的结果吗?
    • 需要我移动的游戏中的所有游戏 ID。
    • 啊哈,我昨天没听懂,但你的意思是一个 sqlfiddle !我在sqlfiddle.com/#!2/425fb/3/0 创建了一个
    猜你喜欢
    • 2021-07-16
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多