我正在为一家教堂开发一个出勤监控数据库应用程序,其目标是获取每个成员的连续出席和缺席情况。但连续计数将按周计算
例如,我们每周有 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/