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 · 192 天前 · 1994 次点击
    这是一个创建于 192 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
       192 天前
    select * 用 group by ?没明白你想分啥组。。。
    iyaozhen
        2
    iyaozhen  
       192 天前
    只会显示 proc 组中 logtime 倒序后的第一条,并不是全部都按 logtime 倒序。你需要再加个查询排下序
    setsunakute
        3
    setsunakute  
       192 天前
    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  
       192 天前
    select proc, max(logtime) from `testyyy`.`DLLog` group by proc order by max(logtime) desc 这样?
    zpfhbyx
        5
    zpfhbyx  
       192 天前
    😂 top k 问题?
    menghuan
        6
    menghuan  
       192 天前
    3 搂正解
    zhangysh1995
        7
    zhangysh1995  
       192 天前
    考虑一下 window function,用 partition by proc 然后排序
    lshero
        8
    lshero  
       192 天前
    rank over partition
    lichao
        9
    lichao  
       192 天前
    这是 MySQL 比较坑的地方,严格的数据库这里应该报错
    lichao
        10
    lichao  
       192 天前
    @lichao 本身就会报错。。。
    rockyliang
        11
    rockyliang  
       192 天前
    不是很懂你想怎样排序,是每个分组都留下 logtime 最新的那一行,然后整个结果集再按 logtime DESC 排序?
    uti6770werty
        12
    uti6770werty  
    OP
       191 天前
    @setsunakute 我好像看懂了意思,只是这个要出结果要很久,我这里是 70 多秒才能出来。。。

    @rockyliang 是的,每个分组留下 logtime 最新的那一行,然后按 logtime DESC 排序,人话就是:要看每个 proc,最后的 logtime 的整行全部列的内容(*)。。。
    tame619
        13
    tame619  
       191 天前 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  
       191 天前 via iPhone
    inner join
    keepeye
        15
    keepeye  
       191 天前
    不要用 order by,select max(logtime)
    tame619
        16
    tame619  
       191 天前 via iPhone
    直接在 max 完,套一层 select,不用 join 我太蠢了
    onhao
        17
    onhao  
       191 天前
    https://wuhao.pw/archives/178/
    当 group by 遇上 order by 后总感觉语句是对的,然而结果却...
    ricadro
        18
    ricadro  
       191 天前 via iPhone
    mysql 没有开窗函数 只能子查询查询出最新的时间然后在 groupby
    egfegdfr
        19
    egfegdfr  
       191 天前
    group by 和 order by 不能同时使用,需要拆开放到子查询
    leonme
        20
    leonme  
       191 天前 via iPhone
    @lichao 喷错了……2333
    lepig
        21
    lepig  
       191 天前
    好像 select*,max(logtime)就可以。之前做过一个类似的需求
    zhaofq
        22
    zhaofq  
       191 天前
    TOP K 问题
    8.0 版本直接用开窗函数
    低版本用子查询
    MySQL 不支持 order by 和 group by 同时使用实现组内排序
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3849 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 07:58 · PVG 15:58 · LAX 23:58 · JFK 02:58
    ♥ Do have faith in what you're doing.