VvebOIDC/admin/sql/sqlite/product_review.sql

210 lines
4.6 KiB
SQL

-- Product reviews
CREATE PROCEDURE getAll(
-- variables
IN language_id INT,
IN site_id INT,
IN product_id INT,
IN slug CHAR,
IN user_id INT,
IN status INT,
-- pagination
IN start INT,
IN limit INT,
-- return
OUT fetch_all, -- orders
OUT fetch_one -- count
)
BEGIN
SELECT user.username, user.email, user.first_name, user.last_name, user.display_name, user.avatar, user.bio, user.subscribe, product_review.*,user.user_id as user_id,
(SELECT json_group_array(json_object('id',prm.product_review_media_id,'image',prm.image))
FROM product_review_media as prm
WHERE prm.product_review_id = product_review.product_review_id GROUP BY prm.product_review_id) as images
FROM product_review
LEFT JOIN user ON user.user_id = product_review.user_id
WHERE 1 = 1
-- product
@IF isset(:product_id)
THEN
AND product_review.product_id = :product_id
END @IF
-- product slug
@IF isset(:slug)
THEN
AND product_review.product_id = (SELECT product_id FROM product_content WHERE slug = :slug LIMIT 1)
END @IF
-- user
@IF isset(:user_id)
THEN
AND product_review.user_id = :user_id
END @IF
-- status
@IF isset(:status)
THEN
AND product_review.status = :status
END @IF
@SQL_LIMIT(:start, :limit);
SELECT count(*) FROM (
@SQL_COUNT(product_review.product_review_id, product_review) -- this takes previous query removes limit and replaces select columns with parameter product_review_id
) as count;
END
-- Get product review
CREATE PROCEDURE get(
IN product_review_id INT,
OUT fetch_row,
)
BEGIN
-- review
SELECT *
FROM product_review as _ -- (underscore) _ means that data will be kept in main array
LEFT JOIN user on user.user_id = _.user_id
WHERE product_review_id = :product_review_id LIMIT 1;
END
-- Get product reviews stats
CREATE PROCEDURE getProductStats(
-- variables
IN language_id INT,
IN site_id INT,
IN product_id INT,
IN slug CHAR,
IN user_id INT,
IN status INT,
-- return
OUT fetch_all, -- orders
OUT fetch_one -- count
)
BEGIN
-- rating count
SELECT COUNT(*) AS count, summary.rating, summary.rating as array_key
FROM product_review AS summary
WHERE 1 = 1
-- product
@IF isset(:product_id)
THEN
AND summary.product_id = :product_id
END @IF
-- product slug
@IF isset(:slug)
THEN
AND summary.product_id = (SELECT product_id FROM product_content WHERE slug = :slug LIMIT 1)
END @IF
-- user
@IF isset(:user_id)
THEN
AND summary.user_id = :user_id
END @IF
-- status
@IF isset(:status)
THEN
AND summary.status = :status
END @IF
GROUP BY summary.rating;
SELECT AVG(rating.rating) as average
FROM product_review AS rating
WHERE 1 = 1
-- product
@IF isset(:product_id)
THEN
AND rating.product_id = :product_id
END @IF
-- product slug
@IF isset(:slug)
THEN
AND rating.product_id = (SELECT product_id FROM product_content WHERE slug = :slug LIMIT 1)
END @IF
-- user
@IF isset(:user_id)
THEN
AND rating.user_id = :user_id
END @IF
-- status
@IF isset(:status)
THEN
AND rating.status = :status
END @IF
LIMIT 1;
END
-- Add new product review
CREATE PROCEDURE add(
IN product_review ARRAY,
OUT insert_id
)
BEGIN
-- allow only table fields and set defaults for missing values
@FILTER(:product_review, product_review)
INSERT INTO product_review
( @KEYS(:product_review) )
VALUES ( :product_review )
END
-- Edit product review
CREATE PROCEDURE edit(
IN product_review ARRAY,
IN id_product_review INT,
OUT affected_rows
)
BEGIN
-- allow only table fields and set defaults for missing values
@FILTER(:product_review, product_review)
UPDATE product_review
SET @LIST(:product_review)
WHERE product_review_id = :product_review_id
END
-- Delete product review
CREATE PROCEDURE delete(
IN product_review_id ARRAY,
OUT affected_rows
)
BEGIN
DELETE FROM product_review WHERE product_review_id IN (:product_review_id)
END