mysql - sql - 获取连续的出席和缺席

标签 mysql sql

我正在为一家教堂开发一个出勤监控数据库应用程序,其目标是获取每个成员的连续出席和缺席情况。但连续计数将按周计算

例如,我们每周有 3 趟服务(周一、周三、周五各一趟),但这些服务是相同的(唯一的区别是时间/日期)。因此成员可以参加任何这些 session (如果他们愿意,他们可以参加所有 session )

例如,我必须根据周找到每个成员的连续出席和缺席情况 如果我在 2014 年 12 月的出勤情况是:

     S   M   T   W   T   F   S
W1   -   P   -   P   -   -   -
W2   -   P   -   -   -   -   -
W3   -   P   -   P   -   P   -
W4   -   -   -   -   -   P   -
W5   -   P   -   -   -   -   -

我连续收到 5 份礼物 我每周只能计算一次出席人数(任何其他出席都将被忽略)

这是表格

tbl_members

member_id  last_name  first_name ... and so on
1          SANTIAGO   JOHN KERNELLE

tbl_service_attendances

att_index  service_date  member_id
1          2014-12-01    1
2          2014-12-03    1
3          2014-12-08    1
4          2014-12-15    1
5          2014-12-17    1
6          2014-12-19    1
7          2014-12-26    1
8          2014-12-29    1

att_index 自动递增

对于成员(member)的每次出席,我都会使用以下查询:

INSERT INTO tbl_service_attendances(service_date, member_id) VALUES('2014-12-29', 1)

如果他们在一周内参加 8 次服务,则 tbl_service_attendances 每场服务将有 8 行(唯一的区别是他们的日期)。但它只能算作 5 份连续礼物。 (每周计数一次)

    S   M   T   W   T   F   S
W1  -   P   -   P   -   -   -
W2  -   P   -   -   -   -   -
W3  -   P   -   P   -   P   -
W4  -   -   -   -   -   -   -
W5  -   -   -   -   -   -   -

在这种情况下,我连续缺勤 2 次,

我还必须知道连续词是否存在或不存在

请帮忙,提前致谢

到目前为止,我已经通过循环查询完成了我的目标,但我认为循环多个查询是不可取的

最佳答案

首先,这种问题在支持窗口函数的 DBMS 中更容易处理,但这里有一个可以与 MySQL 一起使用的想法。为了简化问题,我们首先创建一个 View :

create view wa as select distinct member_id, week(service_date) as wk 
                  from service_attendances; 

我假设我们正在处理一年的数据。如果不是年份,则必须包含在 View 和下面的查询中。

有了这个 View ,我们可以创建每周出勤时间间隔:

select member_id, min(start_wk), end_wk 
from (
    select wa1.member_id, wa1.wk as start_wk, min(wa2.wk) as end_wk 
    from wa as wa1 
    join wa as wa2 
        on wa1.member_id = wa2.member_id 
       and wa2.wk > wa1.wk 
       and not exists ( 
           select 1 
           from wa wa3 
           where wa2.member_id = wa3.member_id 
             and wa3.wk = wa2.wk + 1
       ) 
    group by wa1.wk, wa1.member_id
) as x 
group by member_id, end_wk;

根据您在上面提供的数据,结果是:

+-----------+---------------+--------+
| member_id | min(start_wk) | end_wk |
+-----------+---------------+--------+
|         1 |            48 |     52 |
+-----------+---------------+--------+

由此可以轻松推导出差距。为这个表达式创建另一个 View 是最简单的,但 MySQL 认为这是作弊:

ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause

假设该年的 start_wk 为 1,end_wk 为 52,您可以使用与上述类似的技术来查找每个成员的差距。

希望有帮助。

关于mysql - sql - 获取连续的出席和缺席,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27665595/

相关文章:

mysql - 用户向表中插入数据后调用存储过程

php - 如何在 echo 中打印 PHP 行

MySQL LEFT JOIN 日期与顺序

sql - 连接多个表 : where to filter efficiently

mysql - 这个自加入是如何工作的?

c# - 如何在只有一个数据库查询的情况下在计数器字段上执行 +1?

sql - 查找丢失的记录并返回相邻的记录 SQL

php - 使用 PHP 将数字添加到 MySql 值

php - mySQL PHP 打印多行结果

mysql - 当我使用 Sequelize 的文字时,没有结果