基于select query mysql更新和删除查询

时间:2018-05-18 08:04:37

标签: mysql

如何在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'

1 个答案:

答案 0 :(得分:0)

此程序应该按照您的要求进行。它需要reviewId作为参数(rid)。首先,它将instituteIdstatus选为2个变量iidsts。然后,如果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;

此外,它会根据您的问题假定reviewIdVARCHAR。如果不是这种情况,则需要适当调整参数类型(可能是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