Mysql:如何创建一个列,它是表中的列与视图中的另一列之间的差异

问题描述 投票:0回答:2

在数据库'college2'中有3个表:'学生,课程和注册',以及一个(1)VIEW:'enrolment_status',它是使用以下命令创建的:

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

解释'课程,注册和注册_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)

'course'中的'max_enrolment'列是每个课程允许的最大学生数,例如10或20.'enrolment_status'中的'count(id)'列查看(不是表格)是每个课程中注册的学生的实际数量。 'enrollment'中的'id'列表是在课程中注册的学生ID。

这是我的问题:我想要'剩下的座位数',这是'max_enrolment'列和'count(id)'列之间的区别。 ''left seat'可以是独立的表格或视图,也可以是添加到上述任何表格中的列。我怎样才能做到这一点:

我尝试了很多命令,包括以下内容,

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)
mysql 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
投票

试试这个:

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

© www.soinside.com 2019 - 2024. All rights reserved.