2013-12-13 2 views
1

Я пытаюсь получить с каждым вопросом, что имеет максимальную запись seq_no, но возвращает неверные данные.Функция SQL-MAX, возвращающая неверные данные

Вот запрос:

SELECT id, attempt, seq_number, question 
FROM question_states 
WHERE attempt = 374 
AND seq_number IN (SELECT MAX(seq_number) FROM question_states WHERE attempt = 374 GROUP BY question) 
GROUP BY question, id 

Я один имя таблицы в виде вопросов, структура приводится ниже: -

id--seq_number--attempt--question 
1 --0  --374 -- 130 
2 --0  --374 -- 130 
3 --1  --374 -- 130 
4 --2  --374 -- 130 
5 --1  --374 -- 131 

Почему этот запрос возвращает 2 записей в отношении вопроса 130? и если я удалю GROUP BY id, то вернет неверные данные.

+0

Осмотритесь на похожие вопросы – Strawberry

+0

Да, у меня много вопросов, но нет фруктов. – Suleman

+0

Потому что «id» отличается, я думаю, – Sergey

ответ

2

Попробуйте это:

SELECT id, attempt, seq_number, question 
FROM question_states qs 
INNER JOIN (SELECT question, MAX(seq_number) seq_number 
      FROM question_states WHERE attempt = 374 GROUP BY question 
      ) AS A ON qs.question = A.question AND qs.seq_number = A.seq_number 
WHERE attempt = 374 

ИЛИ

SELECT id, attempt, seq_number, question 
FROM (SELECT id, attempt, seq_number, question 
     FROM question_states WHERE attempt = 374 
     ORDER BY question, seq_number DESC 
    ) AS A 
GROUP BY question 
+0

Во втором ответе у вас нет риска, что поля в SELECT, которые не находятся в GROUP BY или агрегатная функция не гарантируются согласованностью? Было ли документировано использование ORDER BY в производной таблице для преодоления этой проблемы? – AgRizzo

0

В подзапроса, так как вы использовали группу, она будет возвращать два значения '2' и '1'. и в основном запросе, так как вы использовали «IN» заявления, он будет возвращать все данные с полем seq_number и попыткой = 374

попробовать

выбрать максимум (seq_number), идентификатор, попытку, вопрос из группы question_states by seq_number ЗАКАЗАТЬ по seq_number DESC limit 1