Mysql: как создать столбец, который представляет собой разницу между столбцом в таблице и другим столбцом в представлении.

В базе данных «колледж2» есть 3 ТАБЛИЦЫ: «студент, курс и зачисление» и одно (1) ПРЕДСТАВЛЕНИЕ: «статус_зачисления», которое создается с помощью следующей команды:

CREATE VIEW enrolment_status AS
SELECT code, COUNT(id)
FROM enrolment
GROUP BY code;

Объяснение команды для курса, регистрации и enrolment_status приводит к следующему результату:

mysql> EXPLAIN course;
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| code          | char(8)     | NO   | PRI | NULL    |       |
| name          | varchar(90) | YES  | MUL | NULL    |       |
| max_enrolment | char(2)     | YES  |     | NULL    |       |
+---------------+-------------+------+-----+---------+-------+
3 rows in set (0.09 sec)

mysql> explain enrolment;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | char(6) | YES  | MUL | NULL    |       |
| code  | char(8) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.02 sec)

mysql> explain enrolment_status;
+-----------+------------+------+-----+---------+-------+
| Field     | Type       | Null | Key | Default | Extra |
+-----------+------------+------+-----+---------+-------+
| code      | char(8)    | YES  |     | NULL    |       |
| COUNT(id) | bigint(21) | NO   |     | 0       |       |
+-----------+------------+------+-----+---------+-------+
2 rows in set (0.18 sec)

Столбец «max_enrolment» в ТАБЛИЦЕ «курс» — это максимально допустимое количество студентов для каждого курса, скажем, 10 или 20. Столбец «count (id)» в представлении «enrolment_status» (не таблица) — это фактическое количество студентов, зачисленных на каждый курс. . Столбец «id» в таблице «enrolment» — это идентификатор студента, зачисленного на курс.

ВОТ МОЙ ВОПРОС: я хочу, чтобы «количество мест осталось», которое представляет собой разницу между столбцами «max_enrolment» и «count (id)». '#of мест осталось' может быть отдельной таблицей или представлением или столбцом, добавленным к любой из вышеперечисленных таблиц. Как я могу это сделать:

Я пробовал много команд, включая следующие:

CREATE VIEW seats_left AS (
    SELECT course.code, course.max_enrolment - enrolment_status.count
    FROM course, enrolment_status
    WHERE course.code = enrolment_status.code);

... который дает мне следующее сообщение об ошибке:

ERROR 1054 (42S22): Unknown column 'enrolment_status.count' in 'field list'

mysql> SELECT*FROM enrolment_status;
+----------+-----------+
| code     | COUNT(id) |
+----------+-----------+
| COMP9583 |         7 |
| COMP9585 |         9 |
| COMP9586 |         7 |
| COMP9653 |         7 |
| COMP9654 |         7 |
| COMP9655 |         8 |
| COMP9658 |         7 |
+----------+-----------+
7 rows in set (0.00 sec)

mysql> SELECT code, max_enrolment FROM course;
+----------+---------------+
| code     | max_enrolment |
+----------+---------------+
| COMP9583 | 10            |
| COMP9585 | 15            |
| COMP9586 | 15            |
| COMP9653 | 12            |
| COMP9654 | 10            |
| COMP9655 | 12            |
| COMP9658 | 12            |
+----------+---------------+
7 rows in set (0.00 sec)

+----------+---------------------+
| code     | max_enrolment - cnt |
+----------+---------------------+
| COMP9583 |                   9 |
| COMP9585 |                  14 |
| COMP9586 |                  14 |
| COMP9653 |                  11 |
| COMP9654 |                   9 |
| COMP9655 |                  11 |
| COMP9658 |                  11 |
+----------+---------------------+
7 rows in set (0.09 sec)

person peacefull warrior    schedule 14.12.2017    source источник
comment
Сначала создайте счетчик, прежде чем переходить к следующему процессу.   -  person Vijunav Vastivch    schedule 14.12.2017
comment
Является ли счет именем поля вашей таблицы enrolment_status?   -  person Vijunav Vastivch    schedule 14.12.2017


Ответы (2)


Попробуйте использовать аббревиатуру в представлении.

CREATE VIEW enrolment_status AS
SELECT code, COUNT(id) count
FROM enrolment
GROUP BY code;

Тогда вы должны быть в состоянии сделать это:

CREATE VIEW seats_left AS (
SELECT course.code, course.max_enrolment - enrolment_status.count
FROM course, enrolment_status
WHERE course.code = enrolment_status.code);

Если вы не можете изменить представление, вы должны использовать точно такое же имя в запросе:

CREATE VIEW seats_left AS (
SELECT course.code, course.max_enrolment - enrolment_status.'count(id)'
FROM course, enrolment_status
WHERE course.code = enrolment_status.code);
person clinomaniac    schedule 14.12.2017
comment
Спасибо clinomaniac за ваше время и предложение. На самом деле я пробовал обе версии выше: «enrolment_status.count» и «enrolment_status.count(id)». Оба выдают одно и то же сообщение об ошибке. Теперь я пытаюсь увидеть, получаю ли я какой-либо результат, используя команды php, а не только командные строки mysql. - person peacefull warrior; 14.12.2017
comment
Вы пытались изменить представление? Использование () в имени столбца не идеально. - person clinomaniac; 14.12.2017
comment
Отличное предложение, сейчас сделаю! - person peacefull warrior; 14.12.2017
comment
Кроме того... я вижу, что типы данных разные. Один СИМВОЛ, а другой БОЛЬШОЙ. Вы также должны сделать их последовательными. - person clinomaniac; 14.12.2017
comment
@ 'Clinomaniac', использование «count» без (id) дает следующее: ОШИБКА 1054 (42S22): Неизвестный столбец «COUNT» в «списке полей». Я предполагаю, что причина в том, что параметр, который нужно подсчитать: количество студентов (id), проходящих один и тот же курс, должен быть указан. - person peacefull warrior; 14.12.2017
comment
Вы говорите о создании представления? - person clinomaniac; 14.12.2017
comment
В представлении «enrolment_status» код курса: «код» представляет собой комбинацию букв + целых чисел, поэтому мне пришлось использовать CHAR. #студентов, зачисленных на «код» курса, представляет собой двузначный номер. Я был удивлен, что система назначила «bigint (21)» для подсчета (id), который, я думаю, представляет собой большое целое число из 21 цифры. - person peacefull warrior; 14.12.2017
comment
Вы можете использовать приведение в своем представлении, чтобы убедиться, что оба являются целыми числами. Где сейчас ошибка? Удалось ли вам создать представление с псевдонимом? - person clinomaniac; 14.12.2017
comment
Если бы я мог каким-то образом создать столбец: seat_left=max_enrol - count(id), не имело бы большого значения, будет ли это новое «представление» или новый столбец в существующей таблице. - person peacefull warrior; 14.12.2017
comment
Вы создали представление с псевдонимом? CREATE VIEW enrolment_status AS SELECT code, COUNT(id) AS count FROM enrollment GROUP BY code; - person clinomaniac; 14.12.2017
comment
Я не знаком с «приведением» и «просмотром с псевдонимом» (из-за того, что я новичок в кодировании). Мне нужно провести небольшое исследование, чтобы узнать, как они работают. - person peacefull warrior; 14.12.2017
comment
Я считаю, что проблема, с которой вы столкнулись, связана с тем, что имя столбца в представлении enrolment_status имеет (). Если у вас есть такие имена, то все может осложниться. Вот почему я бы порекомендовал воссоздать представление enrolment_status и использовать псевдоним для столбца count(id) в качестве счетчика, чтобы в имени столбца не было ()s. - person clinomaniac; 14.12.2017
comment
Да, я создал представление с помощью команды, точно такой же, как у вас, я не знал, что это называется «представление с псевдонимом». Теперь я знаю.! - person peacefull warrior; 14.12.2017
comment
СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОСМОТР enrolment_status AS SELECT code, COUNT(id) AS counts FROM enrollment GROUP BY code; - person clinomaniac; 14.12.2017
comment
Он ничем не называется. Я просто имею в виду, что представление с использованием псевдонима для этого столбца. Что сейчас возвращает EXPLAIN enrollment_status? - person clinomaniac; 14.12.2017
comment
Я не знаю, насколько надежен следующий источник, они также использовали синтаксис COUNT(). w3resource.com/sql/creating- просмотров/, - person peacefull warrior; 14.12.2017
comment
mysql› SELECT*FROM enrolment_status; +----------+------------+ | код | СЧЁТ (идентификатор) | +----------+------------+ | КОМП9583 | 7 | | КОМП9585 | 9 | | КОМП9586 | 7 | | КОМП9653 | 7 | | КОМП9654 | 7 | | КОМП9655 | 8 | | КОМП9658 | 7 | +----------+-----------+ 7 рядов в сете (0,00 сек) - person peacefull warrior; 14.12.2017
comment
@clinomaniac в вашем последнем запросе вы должны изменить 'enrolment_status.count(id)' на enrolment_status.`count(id)`. Но лучше использовать псевдоним, как вы уже предложили в своем первом запросе. - person Paul Spiegel; 17.12.2017

Попробуй это:

SELECT b.`code`,max_enrolment - cnt from
(select `code`, cnt from
(select count(1) as cnt,`code` from enrolment_status
GROUP BY `code`) as a) as a

LEFT JOIN

(SELECT code,max_enrolment from course) as b
on a.`code` = b.`code`

Вы можете изменить left join на right join

person Vijunav Vastivch    schedule 14.12.2017
comment
Красные, ваш код "частично" работает. В моем первоначальном вопросе выше я опубликовал 3 таблицы: max_enrolment, enrolment_status и таблицу, которую я получаю с помощью вашего кода (которая должна равняться разнице между max_enrol и enrol_status), например: в первой строке max_enrol = 10, enrol_status = 7 , результат должен быть 10-7=3, но код выдает 9. Я не мог понять, почему он так делает. Кстати, я переписал ваш код, используя одинарные кавычки («код»), что не сработало, и я понял, что вместо этого мне пришлось использовать обратные кавычки (code). Спасибо+Rgds - person peacefull warrior; 16.12.2017