2017-12-14 38 views
0

데이터베이스 'college2'에는 'student, course & enrollment'및 ' 보기 : 'enrolment_status', 다음 명령을 사용하여 생성됩니다Mysql : 테이블의 열과보기의 다른 열 사이의 차이를 만드는 방법

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 명입니다. 'enrolment_status'의 'count (id)'열 '보기'(표가 아님)는 각 과정에 등록한 실제 학생 수입니다. 'enrollment'의 'id'열 TABLE은 코스에 등록 된 학생 ID입니다.

내 질문 : max_enrolment 열과 'count (id)'열의 차이 인 '좌 회의 수'를 갖고 싶습니다. '# of seatats left'는 독립 실행 형 테이블 또는 뷰일 수도 있고 위 표에 추가 된 열일 수도 있습니다. 에 대한 약어를 사용하는

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) 
+0

다음 프로세스로 넘어 가기 전에 카운트를 먼저 만듭니다. –

+0

카운트가 테이블'enrolment_status'의 필드 이름입니까? –

답변

2

시도 :

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 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(id)' 
FROM course, enrolment_status 
WHERE course.code = enrolment_status.code); 
+0

시간과 제안을 주신 '감사합니다'. 실제로 위의 두 버전을 시도 : 'enrolment_status.count'및 'enrolment_status.count (id)'. 두 가지 모두 동일한 오류 메시지를 표시합니다. 나는 지금 mysql 명령 행 대신에 PHP 명령을 사용하여 결과를 얻는 지 확인하려고한다. –

+0

보기를 변경하려고 했습니까? 열 이름에 "()"을 사용하는 것이 이상적이지 않습니다. – clinomaniac

+0

우수 제안, 이제 해 보겠습니다! –

0

시도 :

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

뷰를 변경할 수 없다면, 당신은 쿼리에서 동일한 이름을 사용해야합니다 이 :

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 to right join

+0

Reds, 코드 '부분적으로'작동합니다. 위의 원래 질문에 max_enrolment, enrolment_status 및 max_enrol = 10, enrol_status = 7과 같은 코드를 사용하여 max_enrolment와 enrol_status의 차이와 동일한 테이블을 3 개 게시했습니다. 결과는 10-7 = 3이되어야하지만 코드는 9를 제공합니다. 왜 그렇게하는지 알아 내지 못했습니다. BTW, 나는 일하지 않는 작은 따옴표 ('code')를 사용하여 코드를 다시 작성했는데 대신 백틱 ('code')을 사용해야한다는 것을 깨달았다. Tks + Rgds –