Rumah  >  Soal Jawab  >  teks badan

mysql - 寻求统计新增合同数的方案

场景

登陆用户可以随时查看某个时间段的新增合同数

部门成员关系

华东区总经理 
 |--- 华东1区经理 
 |      |---销售主管11 
 |      |    |---销售员111
 |      |    |---销售员112
 |      |---销售主管12
 |           |---销售员121
 |           |---销售员122
 |
 |
 |--- 华东2区经理 
        |---销售主管21 
        |    |---销售员211
        |    |---销售员212
        |---销售主管22
        |    |---销售员221
        |    |---销售员222
        |---销售主管23
        |    |---销售员231
        |    |---销售员232
华北区总经理 
 |--- 华北1区经理 
 |      |---销售主管31 
 |      |    |---销售员311
 |      |    |---销售员312
 |      |---销售主管32
 |           |---销售员321
 |           |---销售员322
 |
 |
 |--- 华北2区经理 
        |---销售主管41 
        |    |---销售员411
        |    |---销售员412
        |---销售主管42
        |    |---销售员421
        |    |---销售员422
        |---销售主管43
        |    |---销售员431
        |    |---销售员432
     

合同表

id          合同id
name        合同名称
created_at  创建时间
created_by  创建人
updated_at  修改时间
updated_by  修改人

计算规则

【新增合同数】 = 【所有下级的新增合同数】+【本人新增合同数】

方案1

数据库是mysql,因为上级合同数,是所有下级的合同数之和,所以,我们递归得到了用户所有下级的用户id
然后再用count(*) from 表 where (created_at时间段条件) and created_by in (所有的下级用户id,包含当前登录用户id)

问题:数据是准确的,但是效率低下,对服务器性能也有影响

方案2

单独用一个表来记录每个用户每天的新增合同数,还是先得到所有下级用户的id,然后再用
select sum(inum) from user_count where (created_at时间段条件)
and created_by in (所有的下级用户id,包含当前登录用户id)

问题:每次 增加,删除,批量删除,都要修改这个字段,如果用户量增大,计数错误的可能性非常大,虽然统计方便了,但是数据不准确

求助

我们网站要统计今日新增,昨日新增,本周新增,本月新增,本季度新增,本年新增,用户还可以自己输入时间段查询
请问大家有没有什么好的方案,可以让数据既准确,统计起来效率又高的?

巴扎黑巴扎黑2727 hari yang lalu720

membalas semua(5)saya akan balas

  • PHP中文网

    PHP中文网2017-05-02 09:28:05

    Pertimbangkan untuk meletakkan salinan kontrak yang baru ditambah dalam redis dan menjelaskannya sekali sehari.

    balas
    0
  • PHPz

    PHPz2017-05-02 09:28:05

    Pilihan 1 adalah pilihan pilihan Satu-satunya masalah ialah lambat untuk mendapatkan semua kakitangan bawahan secara rekursif. Kemudian mari kita selesaikan masalah ini!

    Anggapkan struktur anggaran jadual kakitangan adalah seperti berikut, storan data seperti pokok biasa.
    ID, Nama, Id Ibu Bapa

    Tambahkan Laluan medan padanya, yang nilainya ialah laluan akses kepada orang itu, seperti -12-45-765-, dengan 765 ialah ID pengguna semasa, 45 ialah lebih tinggi daripada 765 dan 12 ialah lebih tinggi daripada 45.

    Dengan medan ini, mudah untuk menapis semua orang bawahan pemimpin dan dirinya berdasarkan IDnya. select id from employee where path like '%-45-%'

    Hanya ingat untuk mengemas kini medan ini apabila mengemas kini gabungan kakitangan pada masa hadapan.

    balas
    0
  • 阿神

    阿神2017-05-02 09:28:05

    Jika anda mempunyai jumlah data yang banyak, anda perlu bertanya dan mengiranya setiap kali anda menyemaknya. Ini sangat, sangat menekan, tidak kira penyelesaian yang anda gunakan.
    Untuk perkara seperti ini, anda juga boleh melakukan statistik pengiraan penstriman secara langsung. Kira sekeping data sekali, dan tanyakan terus apabila menggunakannya.
    Untuk tidak menjejaskan prestasi proses biasa, statistik pengkomputeran penstriman boleh dikendalikan secara tak segerak
    Sistem kami telah melakukan statistik yang serupa Anda boleh melihat 90 hari terakhir apabila melihat statistik harian, dan 3 tahun yang lalu apabila melihat statistik bulanan sebelum ini, anda hanya boleh melihatnya mengikut tahun, yang nampaknya serupa dengan keperluan anda
    Saya menulis kod kecil untuk statistik pengiraan aliran, yang mengambil masa kurang daripada seminggu.
    github.com/panjjo/flysnow Sudah tentu, penulisan kod agak teruk.

    balas
    0
  • 高洛峰

    高洛峰2017-05-02 09:28:05

    Ini ialah keperluan OLAP biasa dalam medan pangkalan data, dan pandangan terwujud boleh dipertimbangkan.

    Untuk rujukan.

    Sayangi MongoDB! Selamat mencuba!

    balas
    0
  • 大家讲道理

    大家讲道理2017-05-02 09:28:05

    Menulis pemasa akan menyelesaikan masalah, itu sahaja! ! !

    balas
    0
  • Batalbalas