V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

员工出席统计系统 Mysql 建表求助

  •  
  •   LeeReamond · 2021-04-19 17:31:09 +08:00 · 938 次点击
    这是一个创建于 1075 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,有一加速需求,自己除了遍历之外没什么办法,来 v2 问问老哥

    具体需求:

    1 、我司有若干员工,目前有一张表内有日期,员工 A,员工 B,员工 C....若干列,第一列是日期,之后每列记录该员工该日是否出席,大概类似下面这样

    -------------------------------------
    |      日期 | 张三 | 李四 | 王五 | ...
    -------------------------------------
    | 20180101 |    1 |   1 |    0 | ...
    -------------------------------------
    | 20180102 |    1 |   1 |    0 | ...
    -------------------------------------
    | 20180103 |    0 |   1 |    1 | ...
    -------------------------------------
    | ...
    -------------------------------------
    

    表中用 1 和 0 代表该日是否出席

    2 、查询需求是,比如“统计张三和李四都出席了,但王五没出席的日期”,select date where a1=1 and a2=1 and a3=0 这种的,特殊的是这个语句需要支持由用户自定义且可能有嵌套,实际执行搜索可能是这样的

    select date from ... where a1=1 and a2=1 and (a3=0 or a4=0)
    

    3 、员工人数小于两百,出席天数总计超过十年,包括周六周日。。。

    问一下老哥们这种有什么好用的解法吗,我目前这个写法没用上任何索引完全是遍历,感觉慢得出奇,一个搜索执行几分钟。。。

    9 条回复    2021-04-20 11:19:50 +08:00
    kkkkkrua
        1
    kkkkkrua  
       2021-04-19 17:42:25 +08:00
    10 年,200 员工,算全部记录,一共也才 73W 条记录,为啥不弄成
    |时间|员工 id|
    |--|--|
    |2021-04-19|zhangsan|
    |2021-04-19|lisi|
    LeeReamond
        2
    LeeReamond  
    OP
       2021-04-19 17:52:22 +08:00
    @kkkkkrua 大佬这个结构之后搜索要怎么搞?不过不太行啊,因为是分部门计算的,每个部门都要搞几十万条
    kkkkkrua
        3
    kkkkkrua  
       2021-04-19 18:02:27 +08:00
    @LeeReamond #2
    select date from tale where employeeId!='wangwu' and employeeIdin ('zhangsan','lisi') group by date having count(*)=2

    没理解分部门是啥意思,再加个部门 id 字段不就好了么。
    按照你那个设计,那表的字段不等于员工数么。。
    skymei
        4
    skymei  
       2021-04-19 18:04:10 +08:00
    你这个需求我第一反应是用位图的交集 差集来做
    xiaofeifei8
        5
    xiaofeifei8  
       2021-04-19 18:17:16 +08:00
    张三李四出席了,和王五有啥关系,你直接查王五是否出席就完事了啊。

    张三|20180101|部门|1|
    李四|20180101|部门|0|
    LeeReamond
        6
    LeeReamond  
    OP
       2021-04-19 18:25:50 +08:00
    @skymei 一般你自己写服务端的话肯定是,但是因为是数据库,就要涉及到数据库的索引和储存之类的东西了,不是很懂怎么优化
    shyrock
        7
    shyrock  
       2021-04-19 18:35:53 +08:00   ❤️ 1
    把出席状态按位组合成整数,则你的表中记录为[20180101,110][20180102, 110][20180103, 011]这种,在整数列建索引,应该可以比较快查出指定整数出席情况对应的日期来。
    acr0ss
        8
    acr0ss  
       2021-04-20 10:51:02 +08:00   ❤️ 1
    楼主的宽表,无法指定添加索引,所以每次都是全表扫描。

    如一楼所述,使用 dt, department_id, user_id, attendance 这样的字段方式,可以把索引添加到 user_id 上;这样能加快搜索。
    mitsuizzz
        9
    mitsuizzz  
       2021-04-20 11:19:50 +08:00
    这种签到类似的,第一反应用 redis 的 bitmap 去做
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2823 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:58 · PVG 22:58 · LAX 07:58 · JFK 10:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.