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

请教大神 SQL 排序问题。难倒我了

  •  
  •   nestlake · 2017-10-20 08:40:01 +08:00 via Android · 5082 次点击
    这是一个创建于 2583 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教大神
    有一个数据表
    city company
    合肥 a
    上海 b
    武汉 c
    合肥 d
    杭州 e
    合肥 f
    武汉 g

    现在想实现如下排序,怎么弄? group by 好像不行
    合肥 a
    合肥 d
    合肥 f
    武汉 c
    武汉 g
    杭州 e
    上海 b

    请教大神,SQL 该怎么写??谢谢😘😚😗😙
    50 条回复    2017-10-24 15:37:11 +08:00
    tomwen
        1
    tomwen  
       2017-10-20 08:42:58 +08:00 via iPhone
    select city, company from table order by city,company;
    tigiyj
        2
    tigiyj  
       2017-10-20 08:44:32 +08:00
    select * from table order by city asc,company asc
    nestlake
        3
    nestlake  
    OP
       2017-10-20 08:47:03 +08:00 via Android
    @tomwen 不对,city 出现的次数从多到少排序
    nestlake
        4
    nestlake  
    OP
       2017-10-20 08:47:24 +08:00 via Android
    @tigiyj city 次数未参与排序
    nestlake
        5
    nestlake  
    OP
       2017-10-20 08:47:36 +08:00 via Android
    继续坐等大神解答,感谢
    nestlake
        6
    nestlake  
    OP
       2017-10-20 08:48:00 +08:00 via Android
    目前,oschina 尚无人能解
    shakoon
        7
    shakoon  
       2017-10-20 08:48:01 +08:00
    第一列根本不知道是什么顺序
    nestlake
        8
    nestlake  
    OP
       2017-10-20 08:49:50 +08:00 via Android
    @shakoon 相同出现次数
    nestlake
        9
    nestlake  
    OP
       2017-10-20 08:50:17 +08:00 via Android
    合肥 3 次,武汉 2 次。。。
    taifus
        10
    taifus  
       2017-10-20 08:51:43 +08:00 via Android
    刚学 sql,话说 2 楼写的是不是对的。
    nestlake
        11
    nestlake  
    OP
       2017-10-20 08:52:41 +08:00 via Android
    坐等感受出现啊
    nestlake
        12
    nestlake  
    OP
       2017-10-20 08:52:53 +08:00 via Android
    万能的 v2
    nestlake
        13
    nestlake  
    OP
       2017-10-20 08:53:02 +08:00 via Android
    @nestlake 高手
    Jackliu91
        14
    Jackliu91  
       2017-10-20 08:54:02 +08:00 via iPhone
    @nestlake 既然要用到次数 先 group by 然后 jion 再 order by 可以。
    tigiyj
        15
    tigiyj  
       2017-10-20 08:57:52 +08:00   ❤️ 1
    SELECT
    p1.city,
    p1.company
    FROM
    table1 AS p1
    LEFT JOIN (
    SELECT
    city,
    count(city) AS num
    FROM
    table1
    GROUP BY
    city
    ) AS p2 ON p1.city = p2.city
    ORDER BY
    p2.num DESC,
    p1.company ASC
    写的比较糙
    x7395759
        16
    x7395759  
       2017-10-20 09:00:01 +08:00
    说实话,你见过 SQL 语句根据数量排序么?
    nestlake
        17
    nestlake  
    OP
       2017-10-20 09:04:00 +08:00 via Android
    @tigiyj 高手终于出现了,感谢感谢😘😚😗😙
    nestlake
        18
    nestlake  
    OP
       2017-10-20 09:04:10 +08:00 via Android
    @x7395759 看你的楼上
    x7395759
        19
    x7395759  
       2017-10-20 09:09:07 +08:00
    @nestlake 这种 sql 的效率,无话可说,当然如果单纯要用 sql 实现,也行吧。
    nestlake
        20
    nestlake  
    OP
       2017-10-20 09:12:57 +08:00 via Android
    @x7395759 高手有无其他更好的解决方案
    x7395759
        21
    x7395759  
       2017-10-20 09:13:43 +08:00
    @nestlake 我建议在生产上不使用复杂的 SQL 语句
    x7395759
        22
    x7395759  
       2017-10-20 09:14:09 +08:00
    @nestlake 不对,不是不使用复杂的 SQL 语句,而是不使用效率低的 SQL 语句
    tigiyj
        23
    tigiyj  
       2017-10-20 09:14:23 +08:00
    @x7395759 实际项目中不会这么用的,lz 应该只是想知道这种排序的 sql 怎么写
    shyling
        24
    shyling  
       2017-10-20 09:17:49 +08:00
    窗口函数吧
    shyling
        25
    shyling  
       2017-10-20 09:18:39 +08:00
    @shyling 好像不是,没仔细看
    zhy0216
        26
    zhy0216  
       2017-10-20 09:19:03 +08:00 via iPhone
    Partition by
    Via8veritas
        27
    Via8veritas  
       2017-10-20 09:21:45 +08:00   ❤️ 2
    select * from test where city in (select city from test group by city having COUNT(*));
    wangzhi
        28
    wangzhi  
       2017-10-20 09:24:04 +08:00   ❤️ 1
    没有看明白 不知道是不是这种 select city,compan,count(city) as c from table group by city order by c;
    zjp
        29
    zjp  
       2017-10-20 09:28:58 +08:00 via Android   ❤️ 1
    SELECT t1.city, t1.company
    FROM your_table AS t1
    JOIN
    (SELECT city, count(city) city_count
    FROM your_table
    GROUP BY city) AS t2
    ON t2.city = t1.city
    ORDER BY city_count DESC, company;

    写了好久…楼上都已经贴出来了→_→
    楼主这种自顶贴的做法真的很烦。没人回复也不代表就没人会。
    zjp
        30
    zjp  
       2017-10-20 09:34:31 +08:00 via Android
    @wangzhi 掉坑里了, 用 GROUP BY 语句会丢掉部分分组,每个 city 应该只保留一行。但应该保留哪一行没有定义,MySQL 某个版本后已经默认禁止这样的语句
    king2014
        31
    king2014  
       2017-10-20 09:43:35 +08:00
    @x7395759 确实这种 sql 纯粹是为了实现而实现的,个人感觉
    king2014
        32
    king2014  
       2017-10-20 09:46:43 +08:00
    可以考虑增加一个字段比如:city_count,每次插入数据的时候更新同一城市的这个字段,排序的时候再 orderby 下这个字段.哈哈,瞎说的.
    lusheldon
        33
    lusheldon  
       2017-10-20 11:43:36 +08:00 via Android   ❤️ 1
    我觉得这种题目挺有意思的,需要比较强的技术能力才能写出来。技术人员首先思考的就是技术问题,能不能做和要不要这么做是两回事。
    liprais
        34
    liprais  
       2017-10-20 11:53:48 +08:00   ❤️ 1
    15 楼是对的
    有些人没写过几个 sql,自己不会写就说用不到,也是可笑
    hsyu53
        35
    hsyu53  
       2017-10-20 12:57:04 +08:00
    @Via8veritas 毕业后就没怎么写过 SQL 的,表示没看懂您的思路。另外,having 后面可以没有关系运算符吗?
    fatduo
        36
    fatduo  
       2017-10-20 14:37:22 +08:00   ❤️ 1
    1. select city, count(*) as cnt from table group by city

    city cnt
    合肥 3
    上海 1
    武汉 2
    杭州 1

    2. select a.city, a.company from table a
    left join (select city, count(*) as cnt from table group by city) b
    on a.city = b.city
    order by b.cnt desc, a.company
    nestlake
        37
    nestlake  
    OP
       2017-10-20 15:28:57 +08:00 via Android
    高手啊
    msg7086
        38
    msg7086  
       2017-10-20 15:38:54 +08:00
    这种 SQL,怎么说呢。
    写的时候一时爽,跑起来了○○○。
    数据量小也就算了。数据量大的话真不怕后人提着刀来算账吗……嚯嚯
    fatduo
        39
    fatduo  
       2017-10-20 15:46:32 +08:00
    @msg7086 为什么数据量大会慢?不理解。。。。
    nestlake
        40
    nestlake  
    OP
       2017-10-20 15:55:33 +08:00 via Android
    @msg7086 还有没有其他更好地实现方式?暂时只想到这种方法
    msg7086
        41
    msg7086  
       2017-10-20 16:17:03 +08:00
    @fatduo city = city 的子查询目测很难用上索引。

    @nestlake 这种需求我不会考虑在 SQL 上做。
    mooncakejs
        42
    mooncakejs  
       2017-10-20 16:41:15 +08:00
    支持开窗就简单,select * from test order by count(1) over (partition by city) desc ,company
    nestlake
        43
    nestlake  
    OP
       2017-10-20 17:14:15 +08:00 via Android
    @mooncakejs 具体点?
    mooncakejs
        44
    mooncakejs  
       2017-10-20 17:29:11 +08:00
    @nestlake 就是这条语句,不过 mysql 并不支持。
    看文档 mysql 8,0 后可以支持。
    nine99
        45
    nine99  
       2017-10-20 17:49:38 +08:00
    改设计,城市改成 region code
    jacsice
        46
    jacsice  
       2017-10-20 17:53:46 +08:00
    @Jackliu91 这位大神这么吊,没人回复?
    mooncakejs
        47
    mooncakejs  
       2017-10-20 17:54:27 +08:00
    mysql 有个类似的实现避免 join, 扫描结果应该是 O(n)。
    select * from test order by find_in_set(city,( select group_concat(city) from (select city from test group by city order by count(1) desc) a)),company ;

    这个需求,不能避免全表扫描。
    nestlake
        48
    nestlake  
    OP
       2017-10-20 18:16:20 +08:00 via Android
    谢谢大家,感谢
    nestlake
        49
    nestlake  
    OP
       2017-10-20 18:16:35 +08:00 via Android
    感觉这里的氛围真好
    nestlake
        50
    nestlake  
    OP
       2017-10-24 15:37:11 +08:00 via Android
    谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2772 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:03 · PVG 21:03 · LAX 05:03 · JFK 08:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.