【问题标题】:count and join has to include records in a table that does not exist in anothercount 和 join 必须包含一个表中不存在于另一个表中的记录
【发布时间】:2013-08-05 23:20:37
【问题描述】:

http://sqlfiddle.com/#!2/26ee6

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 or g.blackPlayer=2)
GROUP by g.gameID, g.whitePlayer, g.blackplayer
HAVING (g.blackPlayer=2 AND lastmove=1)
OR (g.whitePlayer=2 AND lastmove=0)

首选结果:

gameID--lastmove - really move  - is it player=2 's move ?
256 ---- null --=> white -> player2= white = yes its move => out
414 ----  1 ----=> black -> player2= white   = not
497 ----  0 --- => white -> player2= white = yes its move => out
498 ----  1 --- => black -> player2= black = yes its move => out

我正在尝试获取所有游戏

(g.blackPlayer=2 AND lastmove=1) OR (g.whitePlayer=2 AND lastmove=0)

问题在于第 256 场比赛,历史上没有记录。

(count(h.idx)%2) as lastmove  returns 0 and that is good

但 gameID 不在 Join 中,因此 gameID=256 完全错过了!

如果我反过来加入,我将无法无错误地实现 COUNT, 无论如何也错过了256场比赛:

SELECT g.gameID
FROM games as g
  inner join history as h on g.gameID=h.gameID 
WHERE (g.whitePlayer=2 or g.blackPlayer=2)
GROUP by g.gameID, g.whitePlayer, g.blackplayer
HAVING (g.blackPlayer=2 AND ((count(h.idx)%2)=1) -error
OR (g.whitePlayer=2 AND ((count(h.idx)%2)=0)  -error

http://sqlfiddle.com/#!2/26ee6

谁能帮助解决这个问题?谢谢。

【问题讨论】:

    标签: mysql join if-statement count


    【解决方案1】:

    我不是 100% 确定我理解你的问题,但如果你想包含游戏 256,你应该做一个左连接而不是内连接:

    SELECT g.gameID, (count(h.idx)%2) as lastmove
    FROM games AS g
      LEFT JOIN history AS h ON g.gameID=h.gameID 
    WHERE (g.whitePlayer=2 OR g.blackPlayer=2)
    GROUP BY g.gameID, g.whitePlayer, g.blackplayer
    HAVING (g.blackPlayer=2 AND lastmove=1)
    OR (g.whitePlayer=2 AND lastmove=0);
    

    在您的第二个查询中,您缺少几个 )

    如果你用左连接来做,那就是:

    SELECT g.gameID
    FROM games as g
      LEFT JOIN history AS h ON g.gameID=h.gameID 
    WHERE (g.whitePlayer=2 OR g.blackPlayer=2)
    GROUP BY g.gameID, g.whitePlayer, g.blackplayer
    HAVING (g.blackPlayer=2 AND ((count(h.idx)%2)=1))
    OR (g.whitePlayer=2 AND ((count(h.idx)%2)=0))  ;
    

    sqlfiddle

    【讨论】:

    • 现在我知道我真的很接近了,但是 LEFT join 确实可以解决问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多