首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql5.7中的group by

mysql5.7中的group by
EN

Stack Overflow用户
提问于 2016-09-02 15:33:23
回答 2查看 104关注 0票数 0

我发现在mysql5.7和mysql5.5中运行相同的sql,但结果不同。

sql如下所示:

代码语言:javascript
复制
SELECT t2.* FROM (SELECT t1.* FROM t_user t1 ORDER BY t1.id desc) AS t2 GROUP BY t2.type;

Mysql5.7中的结果:

Mysql5.5中的结果:

sql脚本如下所示:

代码语言:javascript
复制
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `gender` varchar(255) DEFAULT NULL,
  `type` varchar(255) DEFAULT NULL,
  `birth` datetime DEFAULT NULL,
  `is_delete` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8;


INSERT INTO `t_user` VALUES ('1', 'James', '0594-5397864', '0', '3', '2016-01-30 19:01:09', '1');
INSERT INTO `t_user` VALUES ('2', 'Hayes', '0594-5392419', '1', '4', '2015-12-24 11:12:27', '1');
INSERT INTO `t_user` VALUES ('3', 'Diana', '0594-5393520', '1', '5', '2016-03-21 13:03:50', '0');
INSERT INTO `t_user` VALUES ('4', 'Rajah', '0594-5399812', '1', '4', '2015-11-26 02:11:35', '0');
INSERT INTO `t_user` VALUES ('5', 'Daria', '0594-5397571', '0', '4', '2016-01-18 11:01:11', '1');
INSERT INTO `t_user` VALUES ('6', 'Lee', '0594-5394539', '1', '1', '2015-10-23 08:10:23', '1');
INSERT INTO `t_user` VALUES ('7', 'Cameran', '0594-5392867', '0', '4', '2016-11-16 12:11:08', '0');
INSERT INTO `t_user` VALUES ('8', 'Wylie', '0594-5395349', '0', '5', '2017-07-06 04:07:27', '0');
INSERT INTO `t_user` VALUES ('9', 'Bertha', '0594-5395287', '1', '1', '2017-02-08 12:02:45', '1');
INSERT INTO `t_user` VALUES ('10', 'Fletcher', '0594-5399246', '0', '4', '2015-09-03 20:09:33', '0');
INSERT INTO `t_user` VALUES ('11', 'Conan', '0594-5391546', '1', '5', '2017-05-15 09:05:23', '0');
INSERT INTO `t_user` VALUES ('12', 'Raymond', '0594-5399666', '0', '3', '2015-10-20 05:10:05', '1');
INSERT INTO `t_user` VALUES ('13', 'Noel', '0594-5397392', '1', '4', '2017-05-26 03:05:56', '0');
INSERT INTO `t_user` VALUES ('14', 'Miriam', '0594-5399081', '0', '2', '2016-05-21 02:05:09', '0');
INSERT INTO `t_user` VALUES ('15', 'Maya', '0594-5397242', '0', '3', '2016-10-24 02:10:50', '1');
INSERT INTO `t_user` VALUES ('16', 'Winifred', '0594-5395142', '1', '1', '2017-03-15 02:03:43', '0');
INSERT INTO `t_user` VALUES ('17', 'Elaine', '0594-5398478', '1', '3', '2017-03-08 15:03:03', '1');
INSERT INTO `t_user` VALUES ('18', 'Robert', '0594-5397830', '0', '5', '2016-02-10 22:02:06', '0');
INSERT INTO `t_user` VALUES ('19', 'Patrick', '0594-5396516', '0', '4', '2015-09-10 07:09:51', '0');
INSERT INTO `t_user` VALUES ('20', 'Darrel', '0594-5397417', '0', '1', '2016-03-11 11:03:36', '0');
INSERT INTO `t_user` VALUES ('21', 'Salvador', '0594-5399732', '1', '3', '2016-01-01 15:01:21', '0');
INSERT INTO `t_user` VALUES ('22', 'Brandon', '0594-5396204', '1', '4', '2016-05-12 06:05:40', '1');
INSERT INTO `t_user` VALUES ('23', 'Dorothy', '0594-5396783', '0', '1', '2016-12-12 10:12:59', '1');
INSERT INTO `t_user` VALUES ('24', 'Kevyn', '0594-5398240', '0', '2', '2016-02-07 04:02:14', '1');
INSERT INTO `t_user` VALUES ('25', 'Brody', '0594-5398774', '1', '1', '2016-12-11 20:12:36', '0');

是什么导致了这种不同..。我的英语很差,哈哈……

EN

回答 2

Stack Overflow用户

发布于 2016-09-02 15:53:09

当涉及到数据完整性时,MySQL太自由了,它的默认设置通常允许您在没有抱怨的情况下完成数据丢失(请参阅ONLY_FULL_GROUP_BY SQL mode的参考资料)。例如,它允许像您的GROUP BY子句这样的不完整的GROUP BY子句,并且只选择一个任意(甚至不是随机的)结果。

您需要重写查询,以便所有涉及的列都属于一个类别:

  • 是SELECT子句中聚合表达式的一部分:

选择MAX(foo)作为maximum_foo

  • Be the GROUP BY子句的一部分:

选择foo...GROUP BY foo

这样,您就足够具体了,所以结果集是确定性的。您当前的代码基本上是:“为每种类型给我一个用户”-but您没有指定任何选择用户的标准。其他DBMS (Oracle、SQL Server)会抱怨:“你没有说如何选择用户”。MySQL只会选择一个任意的用户(但不是随机的用户,因为随机性意味着选择的用户遵循一个规则,但事实并非如此)。SQL模式只是让MySQL像其他引擎一样工作的一种方式。

你也可以去掉你的子查询,它实际上没有任何作用。

票数 1
EN

Stack Overflow用户

发布于 2016-09-02 15:40:52

outer SELECT上的顺序不会导致差异。然而,你想要实现什么呢?从每个组(类型)中只取一个(哪一个)或其他什么?

代码语言:javascript
复制
SELECT * 
FROM t_user
WHERE id IN (SELECT MAX(id) FROM t_user GROUP BY type)
ORDER BY type

SQL link

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39286763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档