1

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

この問題を解決できるのは誰ですか? ありがとうございました。

4

1 に答える 1