我需要一些 MySQL 查询方面的支持。 这就是我的应用程序的工作方式,之后我将解释我想在后端做什么。
在应用程序中,用户可以创建事件(类似 facebook 的事件)并自动使用这些事件创建两个组。之后用户就可以加入这些事件,在事件中加入这两个群组。现在这些事件都有截止日期,所以如果用户没有按时填写这些组,事件将自动取消。
所以我需要在 mysql 中安排事件并检查事件中的组是否已填满最少数量的用户,并且应该每隔一分钟触发一次此事件。
这是我的表格的样子:
event
- id
- group_one_id (Foreign key)
- group_two_id (Foreign key)
groups
- id
user_groups
- id
- user_id
- group_id
所以这是我的查询应该具备的一些条件:
两组用户数应大于10
CREATE EVENT myevent
ON SCHEDULE EVERY 50 SECOND
DO
UPDATE events
SET status = 2 // event is canceled
WHERE .. // here i need help
最佳答案
查询:
UPDATE eventtab e
LEFT JOIN
(
SELECT group_id, count(user_id) AS group_one_users_count
FROM user_groups
GROUP BY group_id
) temp1
ON e.group_one_id = temp1.group_id
LEFT JOIN
(
SELECT group_id, count(user_id) AS group_two_users_count
FROM user_groups
GROUP BY group_id
) temp2
ON e.group_two_id = temp2.group_id
SET event_status = 2
WHERE
IFNULL(group_one_users_count, 0) < 10
OR IFNULL(group_two_users_count, 0) < 10;
解释:
为了能够计算组中参与者的数量,需要在 user_groups
上运行聚合查询。 .现在因为有两个 group_id
在 eventtab
中(在同一个表中),将需要两个单独的聚合查询。这两个是什么LEFT JOIN
在那里。
也有可能某个 group_id
没有任何用户(即没有匹配记录)在 user_groups
table 。这意味着 LEFT JOIN
与 group_id
(即 group_one_id
或 group_two_id
)来自 eventtab
会返回 NULL
JOIN
时的值生效。因此,查询应考虑这些 NULL
值为 0
而不是发现候选人 group_id
在 eventtab
中为此 event_status
应设置为 2
.
假设:
此处假设如果与事件关联的任一组中的用户数少于 10,则事件将被取消。如果应该考虑组合计数,则查询只需要按如下方式进行小的调整:
WHERE
( IFNULL(group_one_users_count, 0)
+
IFNULL(group_two_users_count, 0)
) < 10
希望对您有所帮助。
关于php - MySQL 使用两个查询创建事件调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448679/