首页 新闻 会员 周边

Group By 多个字段 查询问题

0
悬赏园豆:50 [已解决问题] 解决于 2018-12-05 15:58

SQL如下:

SELECT knowledge_versioned_id, max( CASE WHEN type IN (4, 10) AND state = 10 THEN operator_id ELSE NULL END ) creator_id, max( CASE WHEN type IN (5) AND state = 10 THEN operator_id ELSE NULL END ) city_reviewer_id, max( CASE WHEN type IN (4, 10, 6) AND state = 10 THEN operator_id ELSE NULL END ) province_reviewer_id, max( CASE WHEN type IN (4, 10) AND state = 10 THEN operation_time ELSE NULL END ) operation_time, publish_time, template_id, location_id FROM knowledge_statistic WHERE state = 10 AND type IN (4, 5, 6, 10) GROUP BY knowledge_versioned_id, operation_time

为什么 group by后面是knowledge_versioned_id, operation_time,select 后面能跟除了这两个字段之外的非聚合字段publish_time, template_id, location_id?原则上groupby了之后搜索字段只能跟group by后面的字段和聚合函数吗?

确定的是这个sql能执行,不会报错,而且得到了正确的数据。

LittleAnts的主页 LittleAnts | 初学一级 | 园豆:4
提问于:2018-06-07 15:03
< >
分享
最佳答案
0

你可以这么想一下,假如有个表Table1,它有三个字段A, B, C,数据如下:

A  B  C

1  1  1

1  1  2

1  2  1

对于前两行数据,你按A,B分组后,结果是一行,你没法儿确定是选择第一行还是第二行或者其它,所以如果select中要显示C,需要有一个聚合函数来得到唯一解,比如max, min, sum之类

收获园豆:50
jello chen | 大侠五级 |园豆:7306 | 2018-06-09 22:20

我知道可以加聚合函数啊,但是现在就是他这个sql后面加了不是聚合函数的字段,结果是符合我们预期的,但是我不知道为啥能这么加,问了我们老大,说是mysql语法不严格,笑哭

LittleAnts | 园豆:4 (初学一级) | 2018-06-14 09:57
其他回答(3)
0

这是SQL语法的规定,用了group by,则select之后的字段除聚合函数外都必须出现在group by中,你可以少于group by中的字段,但不能包含group by中没有的字段

土生搞IT | 园豆:18 (初学一级) | 2018-06-07 15:47

publish_time, template_id, location_id这三个字段没在groupby后面,为什么select 可以查呢?

支持(0) 反对(0) LittleAnts | 园豆:4 (初学一级) | 2018-06-07 15:52

@ʚ飞累的荆棘鸟√: publish_time, template_id, location_id这几个字段查到值了吗

支持(0) 反对(0) 土生搞IT | 园豆:18 (初学一级) | 2018-06-07 16:02

@ʚ飞累的荆棘鸟√: 查是可以查出来的,结果应该是有问题的

支持(0) 反对(0) 土生搞IT | 园豆:18 (初学一级) | 2018-06-07 16:15

@土生搞IT: 结果都是正确的啊,如果不能查会直接报错的

支持(0) 反对(0) LittleAnts | 园豆:4 (初学一级) | 2018-06-07 16:16

@ʚ飞累的荆棘鸟√: 你怎么知道是正确的呢?你是得到了预想的结果了?还是说拿一个错误的语句去验证了错误的结果得到了正确的结论?

支持(0) 反对(0) 土生搞IT | 园豆:18 (初学一级) | 2018-06-07 16:19
0

groud by 分组 一次 统计一次

男人要爽 | 园豆:6 (初学一级) | 2018-06-07 16:16
0

仔细看了一下, 这个sql可以执行没有语法错误;
publish_time, template_id, location_id 这三个字段的值你确定是你想要的吗?
因为你sql是根据knowledge_versioned_id, operation_time分组的,相当于多条记录合并成一条,publish_time, template_id, location_id 这三个字段的值对应的是多条记录中的一条记录

、熙和 | 园豆:1508 (小虾三级) | 2018-06-07 16:54

这是数据库元数据格式。他这个publish_time,template_id,location_id 来自哪条记录啊?是都来自一条记录还是拼接的?我对group by 多字段怎么执行是真的不太了解

支持(0) 反对(0) LittleAnts | 园豆:4 (初学一级) | 2018-06-08 16:33

@ʚ飞累的荆棘鸟√: 应该是分组前对应的第一条记录吧, 没研究过不做过多评论,
因为用group by 一般都是要获取分组后聚合函数的值

支持(0) 反对(0) 、熙和 | 园豆:1508 (小虾三级) | 2018-06-08 18:29

我想知道的是为什么它违反了group by语法还能正常查询?

支持(0) 反对(0) 七漓 | 园豆:202 (菜鸟二级) | 2020-07-07 09:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册