Как выбрать в наборе записей, имеющих значение 0 или 1 в поле, запись со значением 1, только если она существует, в mysql?

0

У меня есть таблица "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

Теги:

1 ответ

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
  • 0
    Сейчас все проще! : D Спасибо большое, работает отлично. Есть определенная причина, почему вы избавились от DISTINCT в начале?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню