php - MySQL 使用两个查询创建事件调度程序

标签 php mysql

我需要一些 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_ideventtab 中(在同一个表中),将需要两个单独的聚合查询。这两个是什么LEFT JOIN在那里。

也有可能某个 group_id 没有任何用户(即没有匹配记录)在 user_groups table 。这意味着 LEFT JOINgroup_id (即 group_one_idgroup_two_id )来自 eventtab会返回 NULL JOIN 时的值生效。因此,查询应考虑这些 NULL值为 0而不是发现候选人 group_ideventtab 中为此 event_status应设置为 2 .


假设:

此处假设如果与事件关联的任一组中的用户数少于 10,则事件将被取消。如果应该考虑组合计数,则查询只需要按如下方式进行小的调整:

WHERE 
    ( IFNULL(group_one_users_count, 0) 
      + 
      IFNULL(group_two_users_count, 0) 
    ) < 10


Demo

希望对您有所帮助。

关于php - MySQL 使用两个查询创建事件调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448679/

相关文章:

mysql - MySQL 是否会就地轮转日志?

mysql - 使用生成的主键引用表

MySQL 优化子查询

php - 多维数组?根据同一数组中的值切换项目的颜色(在数组中)

php - 在 Kohana 3 中,您如何找出查询期间出现的错误?

php - 如何回显这种查询

python - Django 管理员不会显示字段

javascript - 使用 jQuery 从数据库访问对象

php - 如何使用PHP编写MySQL搜索查询

php - 如何在 shell 中递归正则表达式重命名?