MySQL Query - получение пропущенных записей при использовании группировки - PullRequest
0 голосов
/ 12 января 2009

У меня есть запрос:

select score, count(1) as 'NumStudents' from testresults where testid = 'mytestid'
group by score order by score

где таблица testresults содержит выступления студентов в тесте. Пример результата выглядит следующим образом, при условии, что максимальные оценки теста равны 10.

оценка, NumStudents

0 10
1 20
2 12
3 5
5 34
..
10 23

Как видите, этот запрос не возвращает никаких записей для оценок, которые не набрал ни один студент. Например, Никто не набрал 4/10 в тесте, и в результатах запроса нет записей для Score = 4.

Я хотел бы изменить запрос, чтобы получить эти пропущенные записи со значением 0 в качестве значения для поля NumStudents. Так что мой конечный результат будет иметь максимум + 1 запись, по одной на каждую возможную оценку.

Есть идеи?

EDIT:

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

Ответы [ 4 ]

2 голосов
/ 12 января 2009

SQL хорош для работы с наборами значений данных в базе данных, но не так хорош для наборов значений данных, которые не в базе данных.

Лучший обходной путь - сохранить одну маленькую таблицу для значений, которые вам нужно выбрать:

CREATE TABLE ScoreValues (score int);
INSERT INTO ScoreValues (score) 
  VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

Учитывая ваш комментарий о том, что вы определяете максимальные оценки теста в другой таблице, вы можете присоединиться к этой таблице следующим образом, при условии, что ScoreValues обязательно будет иметь значения, по крайней мере, такие же высокие или более высокие, чем самые большие максимальные оценки теста:

SELECT v.score, COUNT(tr.score) AS 'NumStudents'
FROM ScoreValues v 
  JOIN Tests t ON (v.score <= t.maxmarks)
  LEFT OUTER JOIN TestResults tr ON (v.score = tr.score AND t.testid = tr.testid)
WHERE t.testid = 'mytestid'
GROUP BY v.score;
1 голос
/ 12 января 2009

Самым очевидным способом было бы создать таблицу с именем "Счета" и оставить внешнее присоединение таблицы к ней.

ВЫБРАТЬ s.score, COUNT (1) AS ScoreCount
ОТ балла AS s
СЛЕДУЮЩЕЕ ВНЕШНЕЕ СОЕДИНЕНИЕ testScores AS ts
ON s.score = ts.score
GROUP BY s.score

Если вы не хотите создавать таблицу, вы можете использовать

SELECT
1 как оценка, СУММА (СЛУЧАЙ, КОГДА ts.score = 1, ТОГДА 1, ИЛИ 0, КОНЕЦ) КАК оценка счета,
2 как балл, СУММА (СЛУЧАЙ, КОГДА ts.score = 2 ТОГДА 1, ЛИБО 0 КОНЕЦ) КАК ScoreCount,
3 как балл, СУММА (СЛУЧАЙ, КОГДА ts.score = 3 ТОГДА 1, ДРУГОЙ, 0 КОНЕЦ) КАК ScoreCount,
4 как балл, СУММА (СЛУЧАЙ, КОГДА ts.score = 4 ТОГДА 1, ЛИБО 0 КОНЕЦ) КАК ScoreCount,
... 10 как балл, СУММА (СЛУЧАЙ, КОГДА ts.score = 10 ТОГДА 1, ЛИБО 0 КОНЕЦ) КАК Счёт ОТ testScores AS ts

0 голосов
/ 12 января 2009

Так же, как мысленное упражнение, я придумал это для генерации последовательности в MySQL. Пока количество таблиц во всех базах данных в квадрате блока меньше, чем общая длина последовательности, он будет работать. Я не рекомендовал бы это для производства все же;)

SELECT @n:=@n+1 as n from (select @n:=-1) x, Information_Schema.Tables y, Information_Schema.Tables WHERE @n<20; /* sequence from 0 to 20 inclusive */
0 голосов
/ 12 января 2009

Поддерживает ли MySQL функции, возвращающие множество? В последних выпусках PostgreSQL есть функция generate_series(start, stop), которая создает значение start в первой строке, start+1 во второй и т. Д. До stop в stop-й строке. Преимущество этого состоит в том, что вы можете поместить эту функцию в подпункт выбора в предложении FROM, а затем присоединиться к нему, вместо создания и заполнения таблицы и присоединения к ней, как это было предложено le dorfier и Биллом Карвином.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...