V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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
treedon
V2EX  ›  MySQL

统计某个用户的每日订单总额

  •  
  •   treedon · 2017-09-20 14:26:45 +08:00 · 7038 次点击
    这是一个创建于 2656 天前的主题,其中的信息可能已经有所发展或是发生改变。
    材料:user 表 and order 表(order 表有下单日期,订单金额)
    需求 : 统计某用户 指定的日期范围内 [每日] 订单总额

    其实功能已经实现,用循环写出来了. 但是用循环去泡 sql 是很低端的做法

    故到这里寻求更好的思路。
    32 条回复    2018-01-19 15:17:25 +08:00
    treedon
        1
    treedon  
    OP
       2017-09-20 14:32:01 +08:00
    有 8 个人查看了,都没回复
    是我的问题太 low 了嘛?
    sonyxperia
        2
    sonyxperia  
       2017-09-20 14:34:42 +08:00
    需要用到两张表关联查询吗?
    mxm145
        3
    mxm145  
       2017-09-20 14:37:51 +08:00
    如果是每天都需要的数据,是不是应该专门建表存储,每次订单完成去更新一次
    huijiewei
        4
    huijiewei  
       2017-09-20 14:39:32 +08:00
    SELECT SUM(amount) FROM order GROUP BY userId

    用 GROUP BY
    liprais
        5
    liprais  
       2017-09-20 14:39:37 +08:00
    lwldcr
        6
    lwldcr  
       2017-09-20 14:39:43 +08:00
    join 吧
    treedon
        7
    treedon  
    OP
       2017-09-20 14:39:54 +08:00
    @mxm145 我也想这么干,但是别人不愿意。只好我来统计了
    treedon
        8
    treedon  
    OP
       2017-09-20 14:40:38 +08:00
    @sonyxperia 不用关联的 order 表有 user_id 有下单时间 有订单价格
    treedon
        9
    treedon  
    OP
       2017-09-20 14:41:06 +08:00
    @liprais 非常感谢,我去看看
    treedon
        10
    treedon  
    OP
       2017-09-20 14:41:38 +08:00
    @huijiewei 我在看 5 楼 提供的文章也是用 group by
    b821025551b
        11
    b821025551b  
       2017-09-20 14:42:02 +08:00
    你没有指出的关键点是,user 表和 order 表是如何进行关联的。
    treedon
        12
    treedon  
    OP
       2017-09-20 14:44:01 +08:00
    @b821025551b 因为不是特别重点吧
    torbrowserbridge
        13
    torbrowserbridge  
       2017-09-20 14:44:14 +08:00 via Android
    数据量小直接 sql 查询,数据量大可以离线统计,甚至上流式数据处理
    treedon
        14
    treedon  
    OP
       2017-09-20 14:44:28 +08:00
    @b821025551b user 表的 id 关联 order 表的 user_id
    b821025551b
        15
    b821025551b  
       2017-09-20 14:50:53 +08:00
    @treedon #14 那不就是 4 楼的 group by user_id 么
    treedon
        16
    treedon  
    OP
       2017-09-20 15:05:17 +08:00
    @liprais SELECT
    FROM_UNIXTIME('create_time')AS day_day,
    sum(total_price) AS day_sum
    FROM
    order
    WHERE
    user_id = 100
    GROUP BY
    FROM_UNIXTIME('create_time'); 我的 create_time 存的是时间戳 但是输出是 1970
    liprais
        17
    liprais  
       2017-09-20 15:06:30 +08:00
    @treedon 贴数据
    treedon
        18
    treedon  
    OP
       2017-09-20 15:09:11 +08:00
    @liprais 这里不能截图 好憋屈
    order 表的数据是
    user_id create_time total_price
    100 1505871005(2017-09-20) 10
    100 1505810684(19) 20
    100 1505724284(18) 30

    输出的就是 day_day day_sum
    1970-01-01 08:00:00.000000 51.30
    b821025551b
        19
    b821025551b  
       2017-09-20 15:15:52 +08:00
    使用 FROM_UNIXTIME 这个函数前先查查是怎么用的好伐,这里你可以用 DATE_FORMAT(create_time,'%y%m%d')
    liprais
        20
    liprais  
       2017-09-20 15:16:19 +08:00
    @treedon

    我这里是没问题的
    mysql> select from_unixtime(1505871005);
    +---------------------------+
    | from_unixtime(1505871005) |
    +---------------------------+
    | 2017-09-20 09:30:05 |
    +---------------------------+
    1 row in set (0.00 sec)
    treedon
        21
    treedon  
    OP
       2017-09-20 15:21:59 +08:00
    @liprais 我单独使用 select from_unixtime(1505871005); 是没问题的

    但是写 SELECT
    from_unixtime('create_time') AS day_day,
    sum(total_price) AS day_sum
    FROM
    zjr_deal_order
    WHERE
    user_id = 999999
    GROUP BY
    from_unixtime('create_time');

    执行结果就是
    1970-01-01 08:00:00.000000 26.50
    goddoger
        22
    goddoger  
       2017-09-20 15:22:52 +08:00
    SELECT SUM(jine) as 总金额 ,username from `order` WHERE addtime='2017-09-10' GROUP BY username
    liprais
        23
    liprais  
       2017-09-20 15:24:37 +08:00   ❤️ 1
    @treedon
    from_unixtime('create_time') AS day_day
    这个地方是单引号?去掉试试
    oongxx
        24
    oongxx  
       2017-09-20 18:00:25 +08:00
    select sum(amount) ... group by userid, orderdate
    Cabana
        25
    Cabana  
       2017-09-20 20:33:51 +08:00 via Android
    这种事情不是数据库视图干的活吗?直接 SQL 联表查呗
    wyk52012
        26
    wyk52012  
       2017-09-21 10:46:04 +08:00
    SELECT
    DATE(gmt_create_date) AS 'order_create_date',
    SUM(order_total_amount) AS 'daily_order_amount'
    FROM t_101_s_021_order
    WHERE
    gmt_create_date BETWEEN '2017-08-01' AND '2017-09-20'
    AND user_id = 'you user id'
    GROUP BY
    order_create_date;

    > 指定时间查询区间
    > 指定用户
    > 按照日期切割
    > 获取单个用户某个日期段内每日的订单额
    liuzhen
        27
    liuzhen  
       2017-09-21 11:09:42 +08:00
    SELECT
    date('create_time') AS day_day,
    sum(total_price) AS day_sum
    FROM
    `order`
    WHERE
    user_id = 999999
    and create_time BETWEEN '2017-08-01' AND '2017-09-20'
    GROUP BY
    date('create_time');
    treedon
        28
    treedon  
    OP
       2017-09-21 11:48:24 +08:00
    @liprais 可以了...from_unixtime(create_time)
    括号里面不能加那个引号,估计当成字符串了,没当成字段名
    昨天想回复您的,但是 v2 站说我回复太频繁, 禁了我回复 t t
    现在应该可以回复了
    treedon
        29
    treedon  
    OP
       2017-09-22 16:46:15 +08:00
    @liprais 您还在吗
    liprais
        30
    liprais  
       2017-09-22 17:28:04 +08:00
    @treedon 有问题直接问,别人看到也会帮助你的
    treedon
        31
    treedon  
    OP
       2017-09-25 16:22:52 +08:00
    @liprais 哈哈 都解决了
    guojxx
        32
    guojxx  
       2018-01-19 15:17:25 +08:00
    那你可能需要 sql 中有一个 叫做标量函数 month() year()之类的 直接统计
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2828 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:12 · PVG 22:12 · LAX 06:12 · JFK 09:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.