2012-06-19 3 views
1

у меня есть этот запрос:SQL запрос неправильного результат

SELECT `completed`.`ID` AS `ID`,`completed`.`level` AS `level`,`completed`.`completed_in` AS `completed_in`, COUNT(1) AS `right_answers_num` 
FROM `completed` 
INNER JOIN `history` ON `history`.`ID` = `completed`.`ID` 
INNER JOIN `questions` ON `questions`.`ID` = `history`.`question` 
WHERE `completed`.`student_id` = '1' AND `questions`.`answer` = `history`.`answer`  
GROUP BY `completed`.`ID` 
ORDER BY `completed`.`completed_in` DESC 

то, что мне нужно, чтобы получить информацию о каждом испытании в заполненных таблицах (идентификатор, уровень, completed_in, right_answer_num)
проблема с этим запросом является то, что если нет ни одного правильного ответа (history.answer = questions.answer), то он не возвращает строку, а должен возвращать строку (id, level, completed_in), а right_answer_num (счетчик) должен быть нулевым.

пожалуйста, помогите мне ,, спасибо вперед.

+1

Можете ли вы предоставить структуру данных и некоторые данные? –

+2

Если «нет правильного ответа», каковы ваши данные? Никакой строки для этого вопроса? Строка для вопроса, но поле 'answer' -' NULL'? Кроме того, может быть более одной строки в «вопросах» для одного и того же вопроса * (например, один вопрос имеет более одного правильного ответа) *? Как говорит @NWest, нам нужно знать вашу схему, ограничения и полное/категориальное описание данных, с которыми работает запрос. Вам может быть рекомендовано включить примерные данные, чтобы лучше продемонстрировать ваши требования. – MatBailie

+1

Вы могли бы определить содержание своей истории? – Sebas

ответ

4
SELECT 
    completed.ID AS ID, 
    completed.level AS level, 
    completed.completed_in AS completed_in, 
    COUNT(questions.answer) AS right_answers_num 
FROM completed 
     INNER JOIN history ON history.ID = completed.ID 
     LEFT JOIN questions ON questions.ID = history.question AND questions.answer = history.answer 
WHERE 
    completed.student_id = '1' 
GROUP BY 
completed.ID 
ORDER BY completed.completed_in DESC 
+0

Как это отличается от трех ответов, которые были до вас? Он также делает то же самое, что и они, поэтому я сделаю тот же комментарий ... Я сомневаюсь, что этого достаточно, но это невозможно. * МОЙ * вывод состоит в том, что там * IS * строка в 'questions', но поле' answer' равно 'NULL'. * (В отличие от строки, не существующей вообще.) * – MatBailie

+0

у меня другое, что я знаю, как работают левые соединения ... но ваш комментарий верен на второй части – Sebas

+0

Извинения - у этого есть 'questions.answer = history.answer 'в' LEFT JOIN' вместо предложения 'WHERE', что, по крайней мере, исправляет ошибку, присутствующую в других ответах. – MatBailie

1

использовать LEFT OUTER JOIN с учетом INNER JOIN.

+1

Я сомневаюсь, что этого достаточно, но нельзя быть уверенным. * МОЙ * вывод состоит в том, что там * IS * строка в 'questions', но поле' answer' равно 'NULL'. * (В отличие от строки, не существующей вообще). * – MatBailie

0

Второе внутреннее соединение - это то, что приводит к тому, что строки без записи в таблице вопросов не будут опущены. Внутреннее соединение будет возвращать только строки, которые имеют данные во всех соответствующих таблицах. Изменение второго внутреннего соединения с левой присоединиться к следующим образом:

SELECT 
    completed.ID AS ID, 
    completed.level AS level, 
    completed.completed_in AS completed_in, 
    COUNT(questions.answer) AS right_answers_num 
FROM completed 
INNER JOIN history ON history.ID = completed.ID 
LEFT JOIN questions ON questions.ID = history.question 
WHERE completed.student_id = 1  
GROUP BY completed.ID 
ORDER BY completed.completed_in DESC 
+0

Я сомневаюсь, что этого достаточно, но это невозможно. * МОЙ * вывод состоит в том, что там * IS * строка в 'questions', но поле' answer' равно 'NULL'. * (В отличие от строки, не существующей вообще). * – MatBailie

+0

О, и, имея 'questions.answer = history.answer' в предложении' WHERE', вы фактически не выполнили 'LEFT JOIN'. – MatBailie

+0

@ Dems А, приятно поймал. Это то, что происходит, когда вы только просматриваете запрос. Кроме того, если ответ в этом поле является нулевым в таблице 'questions', это' null', как эта строка может быть связана с строкой в ​​таблице 'history', если это внешний ключ? – geekchic

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