SQL Как посчитать таблицу для каждого поля - PullRequest
0 голосов
/ 22 января 2019

У меня есть 3 таблицы, которые:

Курсы

  • courses_id
  • имя

QnAS

  • qna_id
  • student_id
  • courses_id
  • имя
  • вопрос

Студенты

  • student_id
  • имя

Теперь я пытаюсь подсчитать, сколько есть qna для каждого курса. Как мне сделать запрос?

Я пытался сделать это:

SELECT (SELECT COUNT(qna_id) AS Expr1
              FROM    QnAs) AS Count
FROM   QnAs AS QnAs_1 CROSS JOIN
             Courses
GROUP BY Courses.courses_id

Подсчитывает, сколько есть QnA, но не для каждого курса

Вывод, который я получил, - это названия всех курсов и количество счетчиков QnAs, но я хочу получить номер QnA для каждого из курсов

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Кажется, вы просто хотите объединить QNA по идентификатору курса:

select courses_id, count(*)
from qnas
group by courses_id
order by courses_id;

Вместе с названиями курсов:

select c.course_id, c.name, coalesce(q.cnt, 0) as qna_count
from courses c
left join
(
  select courses_id, count(*) as cnt
  from qnas
  group by courses_id
) q on q.course_id = c.course_id
order by c.course_id;
0 голосов
/ 22 января 2019

Это не ответ, а просто объяснение того, что делает ваш запрос.

В своем собственном запросе вы сначала перекрестно объединяете все QnAs со всеми курсами без видимой причины, таким образом получая все возможные комбинации.Таким образом, с двумя курсами, каждый с тремя QNA (что в сумме составляет шесть QNA), вы построите 2 x 6 = 12 строк.

Для каждой из этих строк вы выбираете общее количество строк в QNAтаблица, которая составляет шесть в приведенном выше примере.Таким образом, вы выбрали бы 12 строк, все из которых показывают номер 6.

Но затем вы группируете по идентификатору курса, в результате чего в моем примере только две строки.Вы должны применить агрегатную функцию к вашему подзапросу, например, MAX или SUM, но это не так, что делает ваш запрос недействительным (потому что вы имеете дело со многими строками, но рассматриваете это, как если бы это было одно значение),MySQL, однако, молча применяет ANY_VALUE, поэтому ваш запрос становится следующим:

SELECT
  ANY_VALUE( (SELECT COUNT(*) FROM QnAs) ) AS Count
FROM QnAs AS QnAs_1 
CROSS JOIN Courses
GROUP BY Courses.courses_id;

Надеюсь, это объяснение поможет вам понять, как работают объединения и агрегирование.Возможно, вы захотите установить режим ONLY_FULL_GROUP_BY (https://dev.mysql.com/doc/...), чтобы MySQL сообщал о синтаксической ошибке, вместо того чтобы молча «исправлять» запрос, применяя ANY_VALUE.

0 голосов
/ 22 января 2019

Почему бы просто не использовать GROUP BY?

SELECT q.courses_id, COUNT(qna_id) as cnt
FROM QnAs q
GROUP BY q.courses_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...