You are on page 1of 2

#bai 1

DROP PROCEDURE IF EXISTS displayFilmInfo;


DELIMITER //
CREATE PROCEDURE displayFilmInfo(IN cate_id INT, IN lang_id INT)
BEGIN
IF (cate_id > 0 and lang_id > 0) THEN
select * from film
join film_category on film.film_id = film_category.film_id
where film.language_id = lang_id and film_category.category_id =
cate_id;
ELSEIF (cate_id = 0 and lang_id > 0) THEN
select * from film
where film.language_id = lang_id;
ELSEIF (cate_id > 0 and lang_id = 0) THEN
select * from film
join film_category on film.film_id = film_category.film_id
where film_category.category_id = cate_id;
END IF;
END //
DELIMITER ;

#bai 2

DROP FUNCTION IF EXISTS total_rent;


DELIMITER //
CREATE FUNCTION total_rent (st_id INT, da DATE)
RETURNS INT
READS SQL DATA
BEGIN
DECLARE total INT;
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
SELECT count( DISTINCT inventory.film_id ) INTO total
FROM store
JOIN inventory ON inventory.store_id = store.store_id
JOIN rental ON rental.inventory_id = inventory.inventory_id
WHERE month(rental.rental_date) = month(da) AND year(rental.rental_date) = year(da)
GROUP BY store.store_id
HAVING store.store_id = st_id;
RETURN total;
END //
DELIMITER ;

SELECT store.store_id, total_rent(store.store_id, "2006-02-11") AS


total_film_rented FROM store;

#bai 3
DROP PROCEDURE IF EXISTS filmDiscount;
DELIMITER //
CREATE PROCEDURE filmDiscount(_p INT , _n INT, _date date)
BEGIN
DECLARE f_id INT;
DECLARE cond INT DEFAULT 1;
DECLARE f_cur CURSOR FOR
SELECT inventory.film_id FROM inventory
JOIN rental ON rental.inventory_id = inventory.inventory_id
WHERE MONTH(rental.rental_date) = MONTH(_date) and YEAR(rental.rental_date)
= YEAR(_date)
GROUP BY inventory.film_id
ORDER BY COUNT(rental.rental_id) ASC, inventory.film_id ASC LIMIT _n;
DECLARE EXIT HANDLER FOR NOT FOUND SET cond = 0;
OPEN f_cur ;
WHILE cond DO
FETCH f_cur INTO f_id;
UPDATE film
SET rental_rate = (1-_p/100)* rental_rate
WHERE film_id = f_id;
END WHILE;
CLOSE f_cur;
END //
DELIMITER ;

UPDATE film
SET rental_rate = (1-_p/100)* rental_rate
WHERE film_id in
(SELECT inventory.film_id FROM inventory
JOIN rental ON rental.inventory_id = inventory.inventory_id
WHERE MONTH(rental.rental_date) = MONTH(_date) and YEAR(rental.rental_date) =
YEAR(_date)
GROUP BY inventory.film_id
ORDER BY COUNT(rental.rental_id) ASC, inventory.film_id ASC LIMIT _n);

UPDATE film
RIGHT JOIN
(SELECT inventory.film_id as fid FROM inventory
JOIN rental ON rental.inventory_id = inventory.inventory_id
WHERE MONTH(rental.rental_date) = MONTH("2005-05-24") and YEAR(rental.rental_date)
= YEAR("2005-05-24")
GROUP BY inventory.film_id
ORDER BY COUNT(rental.rental_id) ASC, inventory.film_id ASC LIMIT 5) as lowest_film
on f.film_id = lowest_film.fid
SET rental_rate = (1-_p/100)* rental_rate;

You might also like