基于selectquerymysql更新和删除查询

ldioqlga  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(313)

在mysql中如何在单次查询时解决这个问题
首先从表中选择状态和机构ID:

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'
q8l4jmvw

q8l4jmvw1#

这个过程应该符合你的要求。它需要你想要的 reviewId 作为参数( rid ). 首先它选择 instituteId 以及 status 变成两个变量 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

相关问题