› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
chaodada
V2EX  ›  MySQL

求教大佬数据库问题

  •  
  •   chaodada · Feb 3, 2020 · 3686 views
    This topic created in 2425 days ago, the information mentioned may be changed or developed.

    mysql 相想查询七天之前的总数,查询 6 天之前的总数 5 天之前的总数。。。1 天之前的总数 当天总数 并按照七天日期分组, 有没有一条语句就能解决的办法呢 目前是 SELECT COUNT(id) as count FROM applist WHERE time<DATE_SUB(NOW(), INTERVAL 6 DAY) 循环执行进行查询 有没有更好的办法呢

    11 replies  •  2020-02-04 10:46:43 +08:00
    F281M6Dh8DXpD1g2
        1
    F281M6Dh8DXpD1g2  
       Feb 3, 2020
    算出每天的量,再去选不就行了
    phpfpm
        2
    phpfpm  
       Feb 3, 2020
    你直接 group by 一下然后用程序 sum 得了。

    另一个思路:group by 然后自连接(想想 howto
    zzn
        3
    zzn  
       Feb 3, 2020
    可以生写多个 count filter, `COUNT(*) FILTER (WHERE <condition>)`

    类似这样:

    ```
    SELECT COUNT(id) FILTER( WHERE time<DATE_SUB(NOW(), INTERVAL 6 DAY)) AS _6, COUNT(id) FILTER( WHERE time<DATE_SUB(NOW(), INTERVAL 5 DAY)) AS _5
    ```
    akira
        4
    akira  
       Feb 3, 2020
    每天生成一次比较合理吧
    zzn
        5
    zzn  
       Feb 3, 2020
    @zzn 忘了说,pg 可以这样写,mysql 不知道行不行
    toesbieya
        6
    toesbieya  
       Feb 3, 2020
    和 3 楼写的差不多,
    SELECT COUNT(0) count7,sum(if(time<DATE_SUB(NOW(),INTERVAL 6 DAY),1,0)) count6... FROM applist WHERE time<DATE_SUB(NOW(), INTERVAL 7 DAY)
    lxk11153
        7
    lxk11153  
       Feb 3, 2020
    头像交出来
    chaodada
        8
    chaodada  
    OP
       Feb 3, 2020
    @lxk11153 #7 http://www.sohu.com/a/238654495_612229 去这里拿吧 原图我也没找到哈哈哈哈哈哈哈哈
    chaodada
        9
    chaodada  
    OP
       Feb 3, 2020
    @toesbieya #6
    @zzn #5
    @akira #4
    @zzn #3
    @phpfpm #2
    @liprais #1 感谢大佬们的指教 我写一下实施
    chaodada
        10
    chaodada  
    OP
       Feb 4, 2020
    @phpfpm #2
    @zzn #3
    @zzn #5
    大佬们我最终写成了这样的到了我想要的结果 不知道有没有更好的办法
    select temp.* from
    (
    SELECT COUNT(`user_id`) as count ,DATE_SUB(NOW(), INTERVAL 6 DAY) as count_time FROM `test` WHERE `reg_time`<DATE_SUB(NOW(), INTERVAL 6 DAY)
    UNION ALL
    SELECT COUNT(`user_id`) as count ,DATE_SUB(NOW(), INTERVAL 5 DAY) as count_time FROM `test` WHERE `reg_time`< DATE_SUB(NOW(), INTERVAL 5 DAY)
    UNION ALL
    SELECT COUNT(`user_id`) as count ,DATE_SUB(NOW(), INTERVAL 4 DAY) as count_time FROM `test` WHERE `reg_time`< DATE_SUB(NOW(), INTERVAL 4 DAY)
    UNION ALL
    SELECT COUNT(`user_id`) as count ,DATE_SUB(NOW(), INTERVAL 3 DAY) as count_time FROM `test` WHERE `reg_time`< DATE_SUB(NOW(), INTERVAL 3 DAY)
    UNION ALL
    SELECT COUNT(`user_id`) as count ,DATE_SUB(NOW(), INTERVAL 2 DAY) as count_time FROM `test` WHERE `reg_time`< DATE_SUB(NOW(), INTERVAL 2 DAY)
    UNION ALL
    SELECT COUNT(`user_id`) as count ,DATE_SUB(NOW(), INTERVAL 1 DAY) as count_time FROM `test` WHERE `reg_time`< DATE_SUB(NOW(), INTERVAL 1 DAY)
    UNION ALL
    SELECT COUNT(`user_id`) as count , DATE_SUB(NOW(), INTERVAL 0 DAY) as count_time FROM `test` WHERE `reg_time`< DATE_SUB(NOW(), INTERVAL 0 DAY)
    ) as temp
    phpfpm
        11
    phpfpm  
       Feb 4, 2020
    首先 你最好有一个维度表(各个日期的维度表)
    select date from date_list
    join xxx on xxx.date>{begin date}

    这样将数据从 n 天 m 个数据扩展成 n*m 行

    然后 group by date
    然后 count 你的条件就好(某天单独的,大于某天的)等
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1005 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 23:10 · PVG 07:10 · LAX 16:10 · JFK 19:10
    ♥ Do have faith in what you're doing.