У меня есть база данных, которая выглядит следующим образом.

school
  exam
    firstname: varchar(40)
    name: varchar(40)
    lesson: varchar(30)
    item: smallint(6)
  lessons
    lesson: varchar(30)
    grade: smallint(6)
    abc: char(1)
    edate: date
  students
    firstname: varchar(40)
    name: varchar(40)
    grade: smallint(6)
    abc: char(1)

Моя задача - получить столбцы дат, количество экзаменов на эту дату, количество студентов, которые пишут экзамен на эту дату. Что-то вроде даты - количество экзаменов - количество студентов. Я сделал это, но в двух разных запросах.

SELECT l.edate, COUNT(l.edate) AS Exams
FROM lessons l
WHERE (l.edate IS NOT NULL)
GROUP BY l.edate
ORDER BY l.edate DESC

Result: edate Exams | ==================| 2020-05-24 | 1 | 2020-05-23 | 1 | 2020-05-22 | 2 | 2020-05-20 | 1 | 2020-05-19 | 1 | 2020-05-18 | 1 | 2020-05-16 | 2 | 2020-05-15 | 2 | 2020-05-14 | 5 | ==================|

SELECT l.edate, COUNT(l.edate) AS Writing
FROM lessons l
JOIN students s
ON (l.abc = s.abc) AND (l.grade = s.grade)
WHERE (l.edate IS NOT NULL)
GROUP BY l.edate
ORDER BY l.edate DESC

Result: edate Writing | ====================| 2020-05-24 | 23 | 2020-05-23 | 27 | 2020-05-22 | 40 | 2020-05-20 | 30 | 2020-05-19 | 27 | 2020-05-18 | 25 | 2020-05-16 | 52 | 2020-05-15 | 34 | 2020-05-14 | 116 | ====================|

После того, как я попытался объединить эти два запроса в один, я получил это, но он дает мне одинаковое количество в каждой строке, см. Изображение ниже:

enter image description here

Я знаю, что это из-за добавления новой таблицы, но как мне заставить ее работать?

SELECT l.edate, COUNT(l.edate) AS Exams, COUNT(s.firstname) AS Writing
FROM lessons l
JOIN students s
ON (l.abc = s.abc) AND (l.grade = s.grade)
WHERE (l.edate IS NOT NULL)
GROUP BY l.edate
ORDER BY l.edate DESC
0
Anonymous228 19 Дек 2019 в 22:00

2 ответа

Вы почти получили это. Просто объедините два ваших запроса:

SELECT E.edate, Exams, Writings FROM
(
  SELECT l.edate, COUNT(l.edate) AS Exams
  FROM lessons l
  WHERE (l.edate IS NOT NULL)
  GROUP BY l.edate) As E
JOIN
(
  SELECT l.edate, COUNT(l.edate) AS Writings
  FROM lessons l
  JOIN students s
  ON (l.abc = s.abc) AND (l.grade = s.grade)
  WHERE (l.edate IS NOT NULL)
  GROUP BY l.edate) As W ON E.edate=W.edate
ORDER BY E.edate

ПРИМЕЧАНИЕ: не проверено, нет MySQL на текущей коробке

0
MPelletier 19 Дек 2019 в 20:03

Я думаю, что вы хотите count(distinct). Тем не менее, у ваших таблиц нет уникальных идентификаторов, поэтому я предпочитаю:

SELECT l.edate, COUNT(*) AS Exams, COUNT(DISTINCT s.firstname) AS Writing
FROM lessons l JOIN
     students s
     ON l.abc = s.abc AND l.grade = s.grade
WHERE l.edate IS NOT NULL
GROUP BY l.edate
ORDER BY l.edate DESC
0
Gordon Linoff 19 Дек 2019 в 19:03