ratings
-- DB lab examination
-- Point 1
USE d_breazu_store;
SHOW TABLES;
DROP TABLE IF EXISTS ratings;
CREATE TABLE IF NOT EXISTS ratings(
id_rating INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
rating FLOAT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
product_id INT UNSIGNED NOT NULL,
CONSTRAINT fk_user_rating FOREIGN KEY (user_id) REFERENCES users(id),
CONSTRAINT fk_product_rating FOREIGN KEY (product_id) REFERENCES products(id)
);
-- Point 2
DELIMITER //
CREATE TRIGGER adding_new_rating
BEFORE INSERT ON ratings FOR EACH ROW
BEGIN
DECLARE existing_rating INT;
SELECT ratings.id_rating INTO existing_rating
FROM ratings WHERE ratings.user_id = new.user_id AND ratings.product_id=new.product_id;
IF (existing_rating IS NOT NULL) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Rating already exists!';
END IF;
IF (new.rating > 5 OR new.rating < 1) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Rating out of interval 1-5 !';
END IF;
END //
DELIMITER ;
INSERT INTO ratings (id_rating, rating, user_id, product_id) VALUES(NULL, 5.5 ,1 , 1); -- out of interval
INSERT INTO ratings (id_rating, rating, user_id, product_id) VALUES(NULL, 2 ,1 , 1);
INSERT INTO ratings (id_rating, rating, user_id, product_id) VALUES(NULL, 3 ,2 , 2);
INSERT INTO ratings (id_rating, rating, user_id, product_id) VALUES(NULL, 4 ,2, 2);
INSERT INTO ratings (id_rating, rating, user_id, product_id) VALUES(NULL, 5 ,3 , 2);
TRUNCATE ratings;
SELECT * FROM users;
SELECT * FROM products;
SELECT * FROM ratings;
-- Point 3
DROP VIEW user_ratings;
CREATE VIEW user_ratings AS SELECT
CONCAT(u.first_name, ' ', u.last_name) as full_name,
u.email AS email,
p.name AS product_name,
p.id AS product_id,
r.rating AS rating
FROM users AS u JOIN ratings AS r ON u.id=r.id_rating
JOIN products AS p on r.product_id=p.id;
SELECT * FROM user_ratings;
-- Point 4
SELECT AVG(r.rating) AS average_rating , p.name AS product_name
FROM ratings AS r JOIN products AS p ON r.product_id=p.id
GROUP BY r.product_id ORDER BY average_rating DESC;
Public Last updated: 2020-01-12 06:59:55 PM