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 · 3393 次点击
    这是一个创建于 1301 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   2931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:30 · PVG 21:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.