У меня есть база данных, которая выглядит следующим образом.
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 |
====================|
После того, как я попытался объединить эти два запроса в один, я получил это, но он дает мне одинаковое количество в каждой строке, см. Изображение ниже:
Я знаю, что это из-за добавления новой таблицы, но как мне заставить ее работать?
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
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 на текущей коробке
Я думаю, что вы хотите 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
Похожие вопросы
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.