如何在触发器中将值从一个查询传递到另一个查询

时间:2019-07-27 03:51:07

标签: php mysql database

我需要了解如何执行以下操作: 如果用户的diffPoints字段已更改(从10变为20),则使用diffPoints的新值来增加与该用户在同一组中的所有其他用户的所有upoints字段。我想我会通过触发器来做到这一点。 因此,首先,触发器将监听users表中“ diffPoints”字段中的任何更改。 第二,我将获得与指定的user_id在同一组中的所有用户。我将通过查询来获取用户所属的组,然后使用此结果(即组)通过另一个查询来获取这些组中的其他用户。最后,我将为所有这些用户更新upoints字段。

  1. 第一个查询以获取用户的diffPoints:
select diffPoints 
from
users
where
id=6
  1. 第二次查询以获取该用户所在的所有组:
select gp1.group_id 
from 
grpusrs as gp1
where  
gp1.user_id = 6
  1. 第三次查询以获取同一组中的用户
SELECT
gp2.user_id
FROM
grpusrs as gp2
WHERE
gp2.group_id = gp1.group_id
  1. 第四次查询以更新查询3中所有user_id的upoints:
UPDATE users increment upoints = (diffPoints in query1) WHERE users.id = (user_id from query 3)

请在以下内容中提出建议:

  • 我需要知道在这种情况下是否可以使用触发解决方案。
  • 我可以在查询之间传递值吗?
  • 是否有更好的方法来组合查询1,2,3?
  • 在query4中递增的正确语法是什么?

1 个答案:

答案 0 :(得分:0)

您可以在一个多表更新语句中执行此操作(请参见https://dev.mysql.com/doc/refman/8.0/en/update.html

给予

drop table if exists us,ug;

create table us
(id int ,diffpoints int);
create table ug
(id int, uid int);

insert into us values
(1,10),(2,20),(3,30),(4,40),(5,50),(6,50);

insert into ug values
(1,1), (2,2),(2,3),(5,5),
(6,2), (6,6);

update us  join
(
select us.id,ug.id grp
from us
join ug on ug.uid = us.id
where ug.id in
(select ug.id 
from us
join ug on ug.uid = us.id and us.id = 2
) 
) j on j.id = us.id
set diffpoints = 100;

联接在哪里计算出所有要更新的用户

+------+------------+
| id   | diffpoints |
+------+------------+
|    1 |         10 |
|    2 |        100 |
|    3 |        100 |
|    4 |         40 |
|    5 |         50 |
|    6 |        100 |
+------+------------+
6 rows in set (0.00 sec)