그래서 다음 코드가 있습니다.
CREATE TABLE dispenser(
id_disp int not null auto_increment,
location_disp varchar(20) not null,
full_capacity int not null,
primary key (id_disp)
);
CREATE TABLE records(
time_stamp DATETIME DEFAULT CURRENT_TIMESTAMP not null,
id_dispenser int not null,
nr_pumps int not null,
primary key (id_dispenser,time_stamp)
);
CREATE VIEW left_capacity AS
SELECT
max(time_stamp) AS 'calendar',
id_dispenser AS 'dispenser',
full_capacity AS 'capacity',
(full_capacity-(nr_pumps*3)) AS 'available'
FROM records r, dispenser d
WHERE r.id_dispenser=d.id_disp
GROUP by id_dispenser
ORDER by id_dispenser desc;
그리고 내 뷰 테이블에 문제가 있습니다. (full_capacity-(nr_pumps*3))
왜냐하면 nr_pumps*3
이보다 크면 full_capacity
음수 사용 가능한 값 이 있기 때문 입니다. 계산 결과가 음수이면 값을 0으로 만들 수있는 방법이 있습니까?
사용할 수 있습니다 greatest()
. 가장 큰 인수를 반환합니다.
CREATE VIEW left_capacity
AS
SELECT max(time_stamp) AS calendar,
id_dispenser AS dispenser,
full_capacity AS capacity,
greatest(full_capacity - nr_pumps * 3, 0) AS available
FROM records r
INNER JOIN dispenser d
ON d.id_disp = r.id_dispenser
GROUP by id_dispenser;
몇 가지 추가 참고 사항 :
JOIN
에서 이전 쉼표로 구분 된 목록에 대해 명시 적 구문 을 사용하는 것이 좋습니다 FROM
. 전자는 오류없이 작성하고 읽고 이해하기 쉽습니다.GROUP BY
사용하면 쿼리 형식이 잘못되었습니다. 선택한 열 목록의 모든 열이 GROUP BY
절의 집계 함수에 대한 인수 이거나 절의 열에 완전히 기능적으로 종속되는 것은 아닙니다 GROUP BY
. 슬프게도 이전 버전의 MySQL이나 잘못 구성된 버전은 해당 규칙을 적용하지 않습니다. 그러나 결과는 재미있을 수 있으므로 언젠가 깜짝 놀랄 준비를하십시오.ORDER BY
in a view는 의미가 없습니다 ( LIMIT
너무 관여 하지 않는 한 ). 가장 바깥 쪽 쿼리가를 사용하여 주문을 명시 적으로 정의하지 않는 한 ORDER BY
, SQL 엔진은 일반적으로 임의의 순서로 결과를 반환 할 수 있으며 필요한 경우 수행합니다. 따라서 ORDER BY
뷰에서 최적화 될 수 있습니다.이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다