У меня есть таблица "wordstyped", содержащая "idBook", "guidUser", "bookmarkLetter", "letter", "tryWrong" и "isCorrect".
idBook guidUser bookmarkLetter letter attemptWrong isCorrect
-------------------------------------------------------------------
1 1 100 a 2 0
1 1 100 a 3 0
1 1 100 a 3 1
1 1 101 b 6 0
1 1 101 b 2 0
2 2 101 b 3 0
2 3 152 d 7 0
3 3 153 e 2 0
Я хочу выбрать всю запись со всеми полями, содержащими максимальное число "tryWrong", но отличные триплеты "idBook", "guidUser" и "bookmarkLetter". Я сделал это с помощью этого запроса
SELECT DISTINCT w1.bookmarkletter, w1.attemptsWrong
FROM wordstyped w1 INNER JOIN ( SELECT bookmarkLetter, guidUser, idBook,
MAX(attemptsWrong) AS maxAttemptsWrong
FROM wordstyped
GROUP BY bookmarkLetter, guidUser, idBook ) w2
ON w1.bookmarkLetter = w2.bookmarkLetter AND w1.guidUser = w2.guidUser
AND w1.guidUser = '1'
AND w1.idBook ='1'
AND w1.attemptsWrong = w2.maxAttemptsWrong AND w1.bookmarkLetter >=0
AND w1.bookmarkLetter <=200 ORDER BY 'w1'.'bookmarkletter' ASC
как в этой скрипке http://sqlfiddle.com/#!9/238794/2
Теперь я также хочу выбрать "isCorrect" со значением 1, если хотя бы одно значение записи га имеет значение Коррекция = 1 и 0, если все записи имеют значение 0.
Если я добавлю w1.isCorrect к первому элементу select в примере case like
SELECT DISTINCT w1.bookmarkletter, w1.attemptsWrong, w1.isCorrect
FROM wordstyped w1 INNER JOIN ( SELECT bookmarkLetter, guidUser, idBook,
MAX(attemptsWrong) AS maxAttemptsWrong
FROM wordstyped
GROUP BY bookmarkLetter, guidUser, idBook ) w2
ON w1.bookmarkLetter = w2.bookmarkLetter AND w1.guidUser = w2.guidUser
AND w1.guidUser = '1'
AND w1.idBook ='1'
AND w1.attemptsWrong = w2.maxAttemptsWrong AND w1.bookmarkLetter >=0
AND w1.bookmarkLetter <=200 ORDER BY 'w1'.'bookmarkletter' ASC
(http://sqlfiddle.com/#!9/238794/1), этот набор записей
idBook guidUser bookmarkLetter letter attemptWrong isCorrect
-------------------------------------------------------------------
1 1 101 b 6 0
1 1 101 b 2 0
2 2 101 b 3 0
правильно вернуться
bookmarkLetter attemptWrong isCorrect
-------------------------------------------------------------------
101 6 0
в то время как этот набор записей
idBook guidUser bookmarkLetter letter attemptWrong isCorrect
-------------------------------------------------------------------
1 1 100 a 2 0
1 1 100 a 3 0
1 1 100 a 3 1
возвращается
bookmarkLetter attemptWrong isCorrect
-------------------------------------------------------------------
100 3 0
100 3 1
вместо
bookmarkLetter attemptWrong isCorrect
-------------------------------------------------------------------
100 3 1
Как я могу достичь второго результата?
EDIT: случай, когда у меня есть isCorrect 1, всегда бывает как в примере, т.е. у меня есть две записи с tryWrong, которая является максимальным значением, одно с isCorrect = 0 и одно с isCorrect = 1
Попробуйте это с помощью агрегации и группировки
http://sqlfiddle.com/#!9/238794/4
SELECT w1.bookmarkletter, max(w1.attemptsWrong), max(w1.isCorrect)
FROM wordstyped w1 INNER JOIN
( SELECT bookmarkLetter, guidUser, idBook, MAX(attemptsWrong) AS maxAttemptsWrong
FROM wordstyped
GROUP BY bookmarkLetter, guidUser, idBook ) w2
ON w1.bookmarkLetter = w2.bookmarkLetter AND w1.guidUser = w2.guidUser
AND w1.guidUser = '1'
AND w1.idBook ='1'
AND w1.attemptsWrong = w2.maxAttemptsWrong AND w1.bookmarkLetter >=0
AND w1.bookmarkLetter <=200
group by w1.bookmarkletter
ORDER BY 'w1'.'bookmarkletter' ASC