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
771456556
V2EX  ›  MySQL

MySQL 相同用户不同的金额 如果在一个区间中 统计为一次应该怎么写?

  •  
  •   771456556 · 2019-02-19 18:09:00 +08:00 · 3664 次点击
    这是一个创建于 1885 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设这是示例表

    统计 money 范围在 1-2 的人

    那么

    [王] 应该是 1

    [李] 应该是 1

    [马] 应该是 0

    就是说只要在范围内,不管出现几次,都统计为一次。

    12 条回复    2019-02-20 16:55:15 +08:00
    liprais
        1
    liprais  
       2019-02-19 18:11:01 +08:00   ❤️ 1
    把 money 弄成区间不就行了
    case when money > 1 and money < 2 then 'a' 这样
    771456556
        2
    771456556  
    OP
       2019-02-19 18:44:57 +08:00 via iPhone
    @liprais 现在的需求比这个复杂,不定区间查询(可能会有十几个区间查询),最后还要汇总数据,我想着发个帖子,看有没有人实现一下,然后我根据他的代码再改改。
    Mistwave
        3
    Mistwave  
       2019-02-19 18:56:50 +08:00 via iPhone   ❤️ 1
    可以用 sgn

    -- MySQL
    SELECT user, sign(count(*))
    FROM your_table
    WHERE money >= 1 AND money <= 2
    GROUP BY user
    771456556
        4
    771456556  
    OP
       2019-02-19 20:29:32 +08:00
    @Mistwave #3 谢谢您,明天我上班试试
    TommyLemon
        5
    TommyLemon  
       2019-02-20 10:34:47 +08:00   ❤️ 1
    你的表述有问题。按照下方的示例,应该是根据用户名(user)来分组。
    SELECT count(*) FROM 表名 WHERE money BETWEEN 1 AND 2 GROUP BY user
    TommyLemon
        6
    TommyLemon  
       2019-02-20 10:55:23 +08:00   ❤️ 1
    @TommyLemon
    看错你的意思了,#3 楼方法测试可行。还可以
    SELECT user,EXISTS(SELECT 1 FROM 表名 AS U2 WHERE U2.user=U1.userAND sex=1) FROM 表名 AS U1 GROUP BY user
    TommyLemon
        7
    TommyLemon  
       2019-02-20 10:56:16 +08:00   ❤️ 1
    @TommyLemon
    SELECT user,EXISTS(SELECT 1 FROM 表名 AS U2 WHERE U2.user=U1.user AND money BETWEEN 1 AND 2) FROM 表名 AS U1 GROUP BY user
    771456556
        8
    771456556  
    OP
       2019-02-20 11:03:47 +08:00
    @TommyLemon #5 谢谢谢谢,是我的问题,mysql 不够熟练。把事情想复杂了
    771456556
        9
    771456556  
    OP
       2019-02-20 11:08:45 +08:00
    @TommyLemon #5 您第一个方法也可以,

    select
    count(*) as total
    from
    ( SELECT * FROM `u`
    WHERE money BETWEEN 3 AND 5 GROUP BY user) a


    这样直接可以计算出符合区间内所有人的总数量。
    3#的方法也不错。
    771456556
        10
    771456556  
    OP
       2019-02-20 11:15:43 +08:00
    @771456556

    select
    count(*) as total
    from
    ( SELECT * FROM 表名
    WHERE money BETWEEN 1 AND 2 GROUP BY user) a
    771456556
        11
    771456556  
    OP
       2019-02-20 15:48:46 +08:00
    解决了,其实本质就是去重。。。当时想歪了,可以直接筛选出在范围内的人,然后用 group by 或者 count DISTINCT 来去重。
    Chenamy2017
        12
    Chenamy2017  
       2019-02-20 16:55:15 +08:00
    group
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1187 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:15 · PVG 07:15 · LAX 16:15 · JFK 19:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.