Подсчет вхождений строк, имеющих 3 значения столбца одного и того же MySQL - PullRequest
0 голосов
/ 19 марта 2019

MySQL BEFORE INSERT триггер

У меня есть таблица bookings.У меня есть 3 столбца с именем

facility_id, booking_date, time_slot

У меня также есть другая таблица с именем facility со столбцом с именем facility_id.Они связаны между собой WHERE bookings.faciliy_id = facility.facility_id

Я пытаюсь подсчитать, когда 3 столбца в таблице заказов повторяются, то есть:

1, 2017-02-02,08:00
1, 2017-02-02,08:00

Я ожидал бы, что это будет 2.

Затем я пытаюсь проверить этот результат, чтобы увидеть, соответствует ли его> = значению entity_capacity, которое хранится в таблице объектов.Выдайте сообщение об ошибке, если истина.

DELIMITER
//
 CREATE TRIGGER facility_full BEFORE INSERT ON bookings
    FOR EACH ROW
        BEGIN 
        SELECT DISTINCT facility_id, booking_date, timeslot, COUNT(*) FROM bookings 
        SET COUNT = Answer
            IF (Answer) >=  facility_capacity
            THEN  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Facility Full';
            WHERE bookings.facility_id = facility.facility_id;
            END IF;
    END 
 //
 DELIMITER ;

1 Ответ

0 голосов
/ 19 марта 2019

, как вы сказали, подсчитайте, когда 3 столбца в таблице заказов повторяются. Вот один из способов решить вашу проблему.

DELIMITER
//
 CREATE TRIGGER facility_full BEFORE INSERT ON bookings
    FOR EACH ROW
        BEGIN 
        DECLARE v_count int;
        Declare msg TEXT;
        DECLARE v_facility_capacity  int;


        select count(*) into v_count from bookings where facility_id = New.facility_id and booking_date  = new.booking_date  and time_slot = new.time_slot;

select facility_capacity  into v_facility_capacity from facility 
where facility.facility_id = New.facility_id;

            IF (v_count) >=  v_facility_capacity  THEN
            set msg = concat('MyTriggerError: Facility Full: ', cast(new.facility_id as char));
            signal sqlstate '45000' set message_text = msg;
            END IF;
    END 
 //
 DELIMITER ;
...