nestlake
V2EX  ›  问与答

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

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

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