nestlake
V2EX  ›  问与答

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

  •  
  •   nestlake · Oct 20, 2017 via Android · 5915 views
    This topic created in 3159 days ago, the information mentioned may be changed or developed.
    请教大神
    有一个数据表
    city company
    合肥 a
    上海 b
    武汉 c
    合肥 d
    杭州 e
    合肥 f
    武汉 g

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

    请教大神,SQL 该怎么写??谢谢😘😚😗😙
    50 replies    2017-10-24 15:37:11 +08:00
    tomwen
        1
    tomwen  
       Oct 20, 2017 via iPhone
    select city, company from table order by city,company;
    tigiyj
        2
    tigiyj  
       Oct 20, 2017
    select * from table order by city asc,company asc
    nestlake
        3
    nestlake  
    OP
       Oct 20, 2017 via Android
    @tomwen 不对,city 出现的次数从多到少排序
    nestlake
        4
    nestlake  
    OP
       Oct 20, 2017 via Android
    @tigiyj city 次数未参与排序
    nestlake
        5
    nestlake  
    OP
       Oct 20, 2017 via Android
    继续坐等大神解答,感谢
    nestlake
        6
    nestlake  
    OP
       Oct 20, 2017 via Android
    目前,oschina 尚无人能解
    shakoon
        7
    shakoon  
       Oct 20, 2017
    第一列根本不知道是什么顺序
    nestlake
        8
    nestlake  
    OP
       Oct 20, 2017 via Android
    @shakoon 相同出现次数
    nestlake
        9
    nestlake  
    OP
       Oct 20, 2017 via Android
    合肥 3 次,武汉 2 次。。。
    taifu
        10
    taifu  
       Oct 20, 2017 via Android
    刚学 sql,话说 2 楼写的是不是对的。
    nestlake
        11
    nestlake  
    OP
       Oct 20, 2017 via Android
    坐等感受出现啊
    nestlake
        12
    nestlake  
    OP
       Oct 20, 2017 via Android
    万能的 v2
    nestlake
        13
    nestlake  
    OP
       Oct 20, 2017 via Android
    @nestlake 高手
    Jackliu91
        14
    Jackliu91  
       Oct 20, 2017 via iPhone
    @nestlake 既然要用到次数 先 group by 然后 jion 再 order by 可以。
    tigiyj
        15
    tigiyj  
       Oct 20, 2017   ❤️ 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
    写的比较糙
    quickma
        16
    quickma  
       Oct 20, 2017
    说实话,你见过 SQL 语句根据数量排序么?
    nestlake
        17
    nestlake  
    OP
       Oct 20, 2017 via Android
    @tigiyj 高手终于出现了,感谢感谢😘😚😗😙
    nestlake
        18
    nestlake  
    OP
       Oct 20, 2017 via Android
    @x7395759 看你的楼上
    quickma
        19
    quickma  
       Oct 20, 2017
    @nestlake 这种 sql 的效率,无话可说,当然如果单纯要用 sql 实现,也行吧。
    nestlake
        20
    nestlake  
    OP
       Oct 20, 2017 via Android
    @x7395759 高手有无其他更好的解决方案
    quickma
        21
    quickma  
       Oct 20, 2017
    @nestlake 我建议在生产上不使用复杂的 SQL 语句
    quickma
        22
    quickma  
       Oct 20, 2017
    @nestlake 不对,不是不使用复杂的 SQL 语句,而是不使用效率低的 SQL 语句
    tigiyj
        23
    tigiyj  
       Oct 20, 2017
    @x7395759 实际项目中不会这么用的,lz 应该只是想知道这种排序的 sql 怎么写
    shyling
        24
    shyling  
       Oct 20, 2017
    窗口函数吧
    shyling
        25
    shyling  
       Oct 20, 2017
    @shyling 好像不是,没仔细看
    zhy0216
        26
    zhy0216  
       Oct 20, 2017 via iPhone
    Partition by
    Via8veritas
        27
    Via8veritas  
       Oct 20, 2017   ❤️ 2
    select * from test where city in (select city from test group by city having COUNT(*));
    wangzhi
        28
    wangzhi  
       Oct 20, 2017   ❤️ 1
    没有看明白 不知道是不是这种 select city,compan,count(city) as c from table group by city order by c;
    zjp
        29
    zjp  
       Oct 20, 2017 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  
       Oct 20, 2017 via Android
    @wangzhi 掉坑里了, 用 GROUP BY 语句会丢掉部分分组,每个 city 应该只保留一行。但应该保留哪一行没有定义,MySQL 某个版本后已经默认禁止这样的语句
    king2014
        31
    king2014  
       Oct 20, 2017
    @x7395759 确实这种 sql 纯粹是为了实现而实现的,个人感觉
    king2014
        32
    king2014  
       Oct 20, 2017
    可以考虑增加一个字段比如:city_count,每次插入数据的时候更新同一城市的这个字段,排序的时候再 orderby 下这个字段.哈哈,瞎说的.
    lusheldon
        33
    lusheldon  
       Oct 20, 2017 via Android   ❤️ 1
    我觉得这种题目挺有意思的,需要比较强的技术能力才能写出来。技术人员首先思考的就是技术问题,能不能做和要不要这么做是两回事。
    F281M6Dh8DXpD1g2
        34
    F281M6Dh8DXpD1g2  
       Oct 20, 2017   ❤️ 1
    15 楼是对的
    有些人没写过几个 sql,自己不会写就说用不到,也是可笑
    hsyu53
        35
    hsyu53  
       Oct 20, 2017
    @Via8veritas 毕业后就没怎么写过 SQL 的,表示没看懂您的思路。另外,having 后面可以没有关系运算符吗?
    fatduo
        36
    fatduo  
       Oct 20, 2017   ❤️ 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
       Oct 20, 2017 via Android
    高手啊
    msg7086
        38
    msg7086  
       Oct 20, 2017
    这种 SQL,怎么说呢。
    写的时候一时爽,跑起来了○○○。
    数据量小也就算了。数据量大的话真不怕后人提着刀来算账吗……嚯嚯
    fatduo
        39
    fatduo  
       Oct 20, 2017
    @msg7086 为什么数据量大会慢?不理解。。。。
    nestlake
        40
    nestlake  
    OP
       Oct 20, 2017 via Android
    @msg7086 还有没有其他更好地实现方式?暂时只想到这种方法
    msg7086
        41
    msg7086  
       Oct 20, 2017
    @fatduo city = city 的子查询目测很难用上索引。

    @nestlake 这种需求我不会考虑在 SQL 上做。
    mooncakejs
        42
    mooncakejs  
       Oct 20, 2017
    支持开窗就简单,select * from test order by count(1) over (partition by city) desc ,company
    nestlake
        43
    nestlake  
    OP
       Oct 20, 2017 via Android
    @mooncakejs 具体点?
    mooncakejs
        44
    mooncakejs  
       Oct 20, 2017
    @nestlake 就是这条语句,不过 mysql 并不支持。
    看文档 mysql 8,0 后可以支持。
    nine99
        45
    nine99  
       Oct 20, 2017
    改设计,城市改成 region code
    jacsice
        46
    jacsice  
       Oct 20, 2017
    @Jackliu91 这位大神这么吊,没人回复?
    mooncakejs
        47
    mooncakejs  
       Oct 20, 2017
    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
       Oct 20, 2017 via Android
    谢谢大家,感谢
    nestlake
        49
    nestlake  
    OP
       Oct 20, 2017 via Android
    感觉这里的氛围真好
    nestlake
        50
    nestlake  
    OP
       Oct 24, 2017 via Android
    谢谢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1017 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 23:09 · PVG 07:09 · LAX 16:09 · JFK 19:09
    ♥ Do have faith in what you're doing.