MySql先排序後去重,Group By與Order By聯用!!!貌似MySql自身有bug?版本mysql-5.7.18-winx64

Create代碼,帶數據

-- --------------------------------------------------------
-- 主機:                           127.0.0.1
-- 服務器版本:                        5.7.18-log - MySQL Community Server (GPL)
-- 服務器操作系統:                      Win64
-- HeidiSQL 版本:                  10.3.0.5771
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;


-- 導出 test 的數據庫結構
CREATE DATABASE IF NOT EXISTS `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `test`;

-- 導出  表 test.table1 結構
CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '我是註釋',
  `id2` int(11) DEFAULT NULL COMMENT '我是註釋',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='我是註釋';

-- 正在導出表  test.table1 的數據:~6 rows (大約)
/*!40000 ALTER TABLE `table1` DISABLE KEYS */;
INSERT INTO `table1` (`id`, `id2`) VALUES
	(1, 1),
	(2, 1),
	(3, 2),
	(4, 2),
	(5, 3),
	(6, 3);
/*!40000 ALTER TABLE `table1` ENABLE KEYS */;

/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

數據原型 :

需求很簡單:按id2去重,取id大的那一行

目標數據:

一般寫法

SELECT * FROM table1 GROUP BY id2 ORDER BY id1 desc

結果:

先聚合,後排序了,可以理解

換個寫法:

SELECT * FROM table1 ORDER BY id1 desc GROUP BY id2

順序不對,報錯

二班寫法

SELECT * FROM (SELECT * FROM table1 ORDER BY id DESC) tt GROUP BY id2

結果:

bug了吧??????????????

三班寫法

SELECT * FROM (SELECT distinct * FROM table1 ORDER BY id DESC) tt GROUP BY id2

神奇了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章