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
この問題を解決できるのは誰ですか? ありがとうございました。