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

基于select query mysql更新和删除查询,mysql,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 revi

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

此过程应满足您的要求。它将所需的
reviewId
作为参数(
rid
)。首先,它将
instituteId
status
选择为两个变量
iid
sts
。然后,如果
sts=1
,则执行更新。最后,它删除了相应的审阅。注意,它使用变量
iid
来避免
更新中的第二个子查询

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

IF sts = 0 OR sts = 1 THEN
  DELETE FROM reviews WHERE reviewId=rid;
END IF;
根据您的问题,它还假设
reviewId
VARCHAR
。如果不是这种情况,则需要适当调整参数类型(可能为
INT

最后,我真的不明白为什么在
更新
中的子查询中有一个
连接
,它所做的事情完全没有必要。您可以将其改写为:

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

不能在单个语句中更新和删除。您可以考虑一个过程。或者可以使用MySQL函数/过程来进行查询?然后如何创建这个查询的过程?这不能解决您的问题吗?如果没有,你能提供更多的信息来帮助解决这个问题吗?