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

0

В базе данных "college2" есть 3 TABLES: "студент, курс и регистрация" и один (1) VIEW: "enrolment_status", который создается с помощью следующей команды:

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

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

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" в "курсе" TABLE - это максимально допустимое число учеников для каждого курса, скажем, 10 или 20. "count (id)" в столбце "enrolment_status" VIEW (не таблица) - это фактическое количество учащихся, обучающихся по каждому курсу, Столбец "id" в "зачислении" TABLE - это идентификатор студента, зарегистрированный в курсе.

ЗДЕСЬ МОЙ ВОПРОС: Я хочу иметь "количество мест слева", что является разницей между столбцом "max_enrolment" и столбцом "count (id)". "Количество мест слева" может быть отдельной таблицей или представлением или столбцом, добавленным в любую из приведенных выше таблиц. Как я могу это сделать:

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

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)
Теги:
create-table
create-view

2 ответа

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);
  • 0
    Спасибо 'clinomaniac' за то, что нашли время и предложили. Я на самом деле пробовал обе версии выше: «enrolment_status.count» и «enrolment_status.count (id)». Оба выдают одно и то же сообщение об ошибке. Теперь я пытаюсь увидеть, получаю ли я какой-либо результат, используя команды php, а не просто командные строки mysql.
  • 0
    Вы пытались изменить представление? Использование «()» в имени столбца не является идеальным.
Показать ещё 17 комментариев
0

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

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

  • 0
    Красные, ваш код "частично" работает. В моем исходном вопросе выше я разместил 3 таблицы: max_enrolment, enrolment_status и таблицу, которую я получаю, используя ваш код (который должен быть равен разнице между max_enrol и enrol_status), например: в первой строке max_enrol = 10, enrol_status = 7 , результат должен быть 10-7 = 3, но код выдает 9. Я не мог понять, почему он это делает. Кстати, я переписал ваш код, используя одинарные кавычки («код»), который не работал, и я понял, что вместо этого я должен был использовать обратные ссылки ( code ). ТКС + Rgds

Ещё вопросы

Сообщество Overcoder
Наверх
Меню