如何在mysql的单个查询中解决这个问题
首先从表格中选择status和instituteId:
select instituteId, status from reviews where reviewId='10'.
如果状态为1,则希望更新和删除表格,如
update institutions SET institutions.overallRatings=(SELECT
avg(b.averageRating) FROM reviews a INNER JOIN reviews b ON
b.instituteId=a.instituteId WHERE a.reviewId='10' AND b.status='1') WHERE
institutions.instituteId=(SELECT instituteId FROM reviews WHERE
reviewId='10')
假设状态为0,则只删除,
DELETE FROM reviews WHERE reviewId='10'
答案 0 :(得分:0)
此程序应该按照您的要求进行。它需要reviewId
作为参数(rid
)。首先,它将instituteId
和status
选为2个变量iid
和sts
。然后,如果sts=1
它执行更新。最后它删除了适当的评论。请注意,它使用变量iid
来避免UPDATE
中的第二个子查询。
DELIMITER //
CREATE PROCEDURE update_institution(IN rid VARCHAR(10))
BEGIN
DECLARE iid, sts INT;
SELECT instituteId, status INTO iid, sts FROM reviews WHERE reviewId=rid;
IF sts = 1 THEN
UPDATE institutions
SET institutions.overallRatings=(SELECT AVG(b.averageRating)
FROM reviews a
INNER JOIN reviews b
ON b.instituteId=a.instituteId
WHERE a.reviewId=rid AND b.status=1)
WHERE institutions.instituteId=iid;
END IF;
DELETE FROM reviews WHERE reviewId=rid;
END //
DELIMITER ;
CALL update_institution('10');
请注意,此过程假设reviews.status
的唯一有效值为0和1.如果不是,则需要在IF
周围放置DELETE
:
IF sts = 0 OR sts = 1 THEN
DELETE FROM reviews WHERE reviewId=rid;
END IF;
此外,它会根据您的问题假定reviewId
是VARCHAR
。如果不是这种情况,则需要适当调整参数类型(可能是INT
)。
最后,我真的不明白为什么JOIN
中的子查询中有UPDATE
,它完全没必要做什么。您可以将其重写为:
SELECT AVG(averageRating)
FROM reviews
WHERE reviewId=rid AND b.status=1
好的,那不是最后的事。要实现此目的,必须只对给定reviewId
进行一次审核。因此,取平均值(使用AVG
)毫无意义,UPDATE
子查询可以进一步简化为:
SELECT averageRating
FROM reviews
WHERE reviewId=rid AND b.status=1