最近发现网上找的 group by 组内排序语句在不同的mysql版本中结果不一样。
 

建表语句:

 
SET FOREIGN_KEY_CHECKS=0;
 
-- ----------------------------
-- Table structure for wp_posts
-- ----------------------------
DROP TABLE IF EXISTS `wp_posts`;
CREATE TABLE `wp_posts` (
  `id` int(11) DEFAULT NULL,
  `title` varchar(6) DEFAULT NULL,
  `post_date` datetime DEFAULT NULL,
  `post_author` varchar(3) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
-- ----------------------------
-- Records of wp_posts
-- ----------------------------
INSERT INTO `wp_posts` VALUES ('1', 'Title1', '2013-01-01 00:00:00', 'Jim');
INSERT INTO `wp_posts` VALUES ('2', 'Title2', '2013-02-01 00:00:00', 'Jim');
INSERT INTO `wp_posts` VALUES ('3', 'Title3', '2016-04-22 11:27:37', 'Jim');
 
 
 
 
我在网上查到group by 组内排序的基本做法是这样的:
 
方法1:
 
SELECT wp_posts.* FROM 
(
    SELECT * 
    FROM wp_posts
    ORDER BY wp_posts.post_date DESC
) AS wp_posts
 
GROUP BY wp_posts.post_author 
 
这种方法在mysql版本5.6.26是没问题的:
 
 
正确的搜出了最大的时间Title3:
 
 
 
 
在mysql版本5.7.11-log是有问题的:
 
 
搜出了最小的时间Title1:
 
 
 
这种排序方法在不同的mysql版本可能结果不一样,那有木有更好的方法呢?
我在
找到了答案。
 
 
 
方法2:
 
SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
 
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
order by p1.post_date desc
 
 
用这种方法排序,以上2种mysql版本都可以用:
 
 
版本5.6.26:
 
 
 
版本5.7.11-log:
 
 
 
 
搜索结果一样,吼吼。
 
总结一下:
 
group by 组内排序
 
方法1:
 
SELECT wp_posts.* FROM 
(
    SELECT * 
    FROM wp_posts
    ORDER BY wp_posts.post_date DESC
) AS wp_posts
 
GROUP BY wp_posts.post_author 
在不同的mysql版本中结果可能不一样;
 
方法2:
 
SELECT p1.* 
FROM wp_posts p1
INNER JOIN
(
    SELECT max(post_date) MaxPostDate, post_author
    FROM wp_posts
 
    GROUP BY post_author
) p2
  ON p1.post_author = p2.post_author
  AND p1.post_date = p2.MaxPostDate
order by p1.post_date desc

在版本5.6.26和版本5.7.11-log中结果是一样的(其他版本我没试过)。

 
 
 

mysql 不同版本下 group by 组内排序的差异的更多相关文章

  1. mysql group by组内排序

    mysql group by组内排序:     首先是组外排序:     SELECT z.create_time,z.invoice_id from qf_invoice_log z where z ...

  2. mysql group by 组内排序 group by 原理

    mysql group by 组内排序   SELECT * FROM (SELECT MAX(id) AS t,wukong_uid, 1 AS tag FROM  toutiao_uid_gath ...

  3. MySQL学习笔记:三种组内排序方法

    由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行 ...

  4. mysql多表查询及其 group by 组内排序

    //多表查询:得到最新的数据后再执行多表查询 SELECT *FROM `students` `st` RIGHT JOIN( //先按时间排序查询,然后分组(GROUP BY ) SELECT * ...

  5. mysql group by 组内排序

    有数据表 comments------------------------------------------------| id | newsID | comment | theTime |---- ...

  6. mysql5.7.10和mysql5.5.39两个版本对于group by函数的处理差异

    原理还是没有搞清楚,在官网上看了一下,看的不是很清楚.一并都记录一下. 问题描述: 存在如下数据结构 sql: 求用户最近更新的那条记录 思路: 按照modify_time排序后按照user_id分组 ...

  7. Groovy在不同JDK版本下的性能差异

    Groovy作为一种动态语言,性能和JAVA比肯定是差不少,根据网友的测试,由于测试环境,场景和编译参数的不同,大概有差2到7倍的差距 那么同样的Groovy,在不同的JDK版本下,会有着怎样的差异呢 ...

  8. MySQL 5.7.17 Group Relication(组复制)搭建手册【转】

    本博文介绍了Group Replication的两种工作模式的架构.并详细介绍了Single-Master Mode的部署过程,以及如何切换到Multi-Master Mode.当然,文末给出了Gro ...

  9. mysql在linux下的安装(5.7版本以后)

    1.添加mysql组和mysql用户,用于设置mysql安装目录文件所有者和所属组. ①groupadd mysql ②useradd -r -g mysql mysql 2.将二进制文件解压到指定的 ...

随机推荐

  1. Hadoop集群(第6期)JDK和SSH无密码配置

    1.Linux配置java环境变量 1.1 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录,执行命令 ./jdk-6u14-linux-i586.bi ...

  2. 关于web系统整体优化提速总结

    关于web系统整体优化提速总结 一.背景 随着公司业务的拓展,随之而来就是各种系统横向和纵向的增加,PV.UV也都随之增加,原有的系统架构和模式慢慢遇上了瓶颈,需要逐步的对系统从整体上进行改造升级,通 ...

  3. 前端学习之Bootstrap学习

    一,Bootstrap简介 在前端世界,有个叫Bootstrap的家伙,,是twitter 开源出来的一套前端框架,利用Ta可以快速开发网站界面,它的特点就是比自己从头写简单,直观,方便,快捷,省劲. ...

  4. Android项目开发之--------地铁时光机(一,搭建主框架)

    一:先看一下框架搭建后的效果图      , 二:框架结构 (1)底部导航栏采用的是: MainActivity(主框架), MsgFragment(首页), HistoryFragment(历史清单 ...

  5. Netty源码分析--创建Channel(三)

    恩~,没错,其实这一篇才是真正的开始分析源码,你打我呀~. 先看一下我Netty的启动类 private void start() throws Exception { EventLoopGroup ...

  6. Flask学习之旅--简易留言板

    一.写在前面 正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用Flask框架做了一个简易留言 ...

  7. yii中find()指定条件

    find()查找指定的条件 $modelName::model->find(); 使用条件对象 $criteria = new CDbCriteria(); $criteria->sele ...

  8. Java:synchronized关键字引出的多种锁

    前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这 ...

  9. centos7.3 格式化和挂载数据盘

    本文使用 fdisk 命令对小于 2 TiB 的数据盘执行分区操作. 1.  运行 fdisk -l 命令查看实例是否有数据盘 2.  创建一个单分区数据盘,依次执行以下命令: 运行 fdisk /d ...

  10. 苹果二代TWS无线耳机AirPods调研

    产品介绍 苹果AirPods二代自从2018年9月份上市以来,到现在将近一年的时间了,据江湖传闻,苹果AirPods的总售卖个数,已经超过了5000W部,这样价格的TWS耳机,能够卖那么多的量,估计也 ...