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
uti6770werty
V2EX  ?  MySQL

Mysql group by 然后再 order by,但不能按最新时间查询出来...

  •  
  •   uti6770werty · 2021-05-31 13:06:46 +08:00 · 3107 次点击
    这是一个创建于 1074 天前的主题,其中的信息可能已经有所发展或是发生改变。
    SELECT * FROM `testyyy`.`DLLog` GROUP BY `proc` ORDER BY `logtime` DESC;

    打算查询出 proc 为分组,logtime 最新(降序),但 logtime 是升序的,显示的是最早时间的,语法上是不能这样使用?
    22 条回复  ?  2021-06-01 10:37:44 +08:00
    crazytudou
        1
    crazytudou  
       2021-05-31 13:09:11 +08:00
    select * 用 group by ?没明白你想分啥组。。。
    iyaozhen
        2
    iyaozhen  
       2021-05-31 13:10:46 +08:00
    只会显示 proc 组中 logtime 倒序后的第一条,并不是全部都按 logtime 倒序。你需要再加个查询排下序
    setsunakute
        3
    setsunakute  
       2021-05-31 13:16:44 +08:00
    SELECT *,(select logtime from `testyyy`.`DLLog` as a where a.proc = b.proc order by logtime desc limit 1) FROM `testyyy`.`DLLog` as b GROUP BY `proc`;

    那你应该是需要这样的效果
    7Qi7Qi
        4
    7Qi7Qi  
       2021-05-31 13:18:58 +08:00
    select proc, max(logtime) from `testyyy`.`DLLog` group by proc order by max(logtime) desc 这样?
    zpfhbyx
        5
    zpfhbyx  
       2021-05-31 13:36:40 +08:00
    ? top k 问题?
    menghuan
        6
    menghuan  
       2021-05-31 13:44:38 +08:00
    3 搂正解
    zhangysh1995
        7
    zhangysh1995  
       2021-05-31 13:46:08 +08:00
    考虑一下 window function,用 partition by proc 然后排序
    lshero
        8
    lshero  
       2021-05-31 13:53:03 +08:00
    rank over partition
    lichao
        9
    lichao  
       2021-05-31 14:13:35 +08:00
    这是 MySQL 比较坑的地方,严格的数据库这里应该报错
    lichao
        10
    lichao  
       2021-05-31 14:20:02 +08:00
    @lichao 本身就会报错。。。
    rockyliang
        11
    rockyliang  
       2021-05-31 14:25:12 +08:00
    不是很懂你想怎样排序,是每个分组都留下 logtime 最新的那一行,然后整个结果集再按 logtime DESC 排序?
    uti6770werty
        12
    uti6770werty  
    OP
       2021-05-31 17:18:02 +08:00
    @setsunakute 我好像看懂了意思,只是这个要出结果要很久,我这里是 70 多秒才能出来。。。

    @rockyliang 是的,每个分组留下 logtime 最新的那一行,然后按 logtime DESC 排序,人话就是:要看每个 proc,最后的 logtime 的整行全部列的内容(*)。。。
    tame619
        13
    tame619  
       2021-05-31 17:18:04 +08:00 via iPhone
    SELECT * from LOG l
    left join
    (
    select
    max(logtime),ID
    from LOG
    GROUP BY proc
    )a on a.ID=l.ID
    where a.ID is not null
    ORDER BY l.logtime desc
    tame619
        14
    tame619  
       2021-05-31 17:21:28 +08:00 via iPhone
    inner join
    keepeye
        15
    keepeye  
       2021-05-31 17:26:30 +08:00
    不要用 order by,select max(logtime)
    tame619
        16
    tame619  
       2021-05-31 17:55:53 +08:00 via iPhone
    直接在 max 完,套一层 select,不用 join 我太蠢了
    onhao
        17
    onhao  
       2021-05-31 21:28:55 +08:00
    https://wuhao.pw/archives/178/
    当 group by 遇上 order by 后总感觉语句是对的,然而结果却...
    ricadro
        18
    ricadro  
       2021-05-31 23:10:58 +08:00 via iPhone
    mysql 没有开窗函数 只能子查询查询出最新的时间然后在 groupby
    egfegdfr
        19
    egfegdfr  
       2021-06-01 09:16:04 +08:00
    group by 和 order by 不能同时使用,需要拆开放到子查询
    leonme
        20
    leonme  
       2021-06-01 09:45:00 +08:00 via iPhone
    @lichao 喷错了……2333
    lepig
        21
    lepig  
       2021-06-01 10:37:19 +08:00
    好像 select*,max(logtime)就可以。之前做过一个类似的需求
    zhaofq
        22
    zhaofq  
       2021-06-01 10:37:44 +08:00
    TOP K 问题
    8.0 版本直接用开窗函数
    低版本用子查询
    MySQL 不支持 order by 和 group by 同时使用实现组内排序
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6080 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 02:52 · PVG 10:52 · LAX 19:52 · JFK 22:52
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com