请教大神 SQL 排序问题。难倒我了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nestlake
V2EX    问与答

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

  •  
  •   nestlake 2017-10-20 08:40:01 +08:00 via Android 5483 次点击
    这是一个创建于 2923 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请教大神
    有一个数据表
    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 次。。。
    taifu
        10
    taifu  
       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
    写的比较糙
    quickma
        16
    quickma  
       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 看你的楼上
    quickma
        19
    quickma  
       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 高手有无其他更好的解决方案
    quickma
        21
    quickma  
       2017-10-20 09:13:43 +08:00
    @nestlake 我建议在生产上不使用复杂的 SQL 语句
    quickma     22
    quickma  
       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
    我觉得这种题目挺有意思的,需要比较强的技术能力才能写出来。技术人员首先思考的就是技术问题,能不能做和要不要这么做是两回事。
    F281M6Dh8DXpD1g2
        34
    F281M6Dh8DXpD1g2  
       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     Solana     922 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:13 PVG 05:13 LAX 14:13 JFK 17:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86