2013-08-03 2 views
1

У меня есть две таблицы, которые определяют детали игры: таблицу с играми и таблицу с ходами.Подсчитывать в совокупном подзапросе или присоединяться

я могу сказать, кто превратить это по

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, чтобы увидеть, если это мой ход. Если нет, то я пропускаю эту игру.

Я хотел бы объединить эти два, я попытался сделать агрегатное подмножество, но безуспешно из-за 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

+0

Пожалуйста, помните, что * auto_increment * только гарантированно быть уникальным в таблице , Для них не гарантируется последовательное упорядочение и повторное использование. Это особенно актуально, если вам приходится иметь дело с откатами по транзакционным таблицам: http://sqlfiddle.com/#!2/2d39c/1. Не упоминание параллельных вставок в вашей БД. –

ответ

0

я не совсем закончен, но это отвечает на мой собственный вопрос

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) 
0

попробовать это

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 
+0

ближе, но первый счетчик возвращает все подсчитанные элементы, где whiteplayer = 2. Мне нужны все игры. Если вы сделаете SELECT h.gameID и т. Д., Это вернет только первую подходящую игру. – davidS

+0

Можете ли вы предоставить скрипку и ваш желаемый результат? –

+0

Нужны все игры из игр, где это мой ход. – davidS

Смежные вопросы