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能执行,不会报错,而且得到了正确的数据。
你可以这么想一下,假如有个表Table1,它有三个字段A, B, C,数据如下:
A B C
1 1 1
1 1 2
1 2 1
对于前两行数据,你按A,B分组后,结果是一行,你没法儿确定是选择第一行还是第二行或者其它,所以如果select中要显示C,需要有一个聚合函数来得到唯一解,比如max, min, sum之类
我知道可以加聚合函数啊,但是现在就是他这个sql后面加了不是聚合函数的字段,结果是符合我们预期的,但是我不知道为啥能这么加,问了我们老大,说是mysql语法不严格,笑哭
这是SQL语法的规定,用了group by,则select之后的字段除聚合函数外都必须出现在group by中,你可以少于group by中的字段,但不能包含group by中没有的字段
publish_time, template_id, location_id这三个字段没在groupby后面,为什么select 可以查呢?
@ʚ飞累的荆棘鸟√: publish_time, template_id, location_id这几个字段查到值了吗
@ʚ飞累的荆棘鸟√: 查是可以查出来的,结果应该是有问题的
@土生搞IT: 结果都是正确的啊,如果不能查会直接报错的
@ʚ飞累的荆棘鸟√: 你怎么知道是正确的呢?你是得到了预想的结果了?还是说拿一个错误的语句去验证了错误的结果得到了正确的结论?
groud by 分组 一次 统计一次
仔细看了一下, 这个sql可以执行没有语法错误;
publish_time, template_id, location_id 这三个字段的值你确定是你想要的吗?
因为你sql是根据knowledge_versioned_id, operation_time分组的,相当于多条记录合并成一条,publish_time, template_id, location_id 这三个字段的值对应的是多条记录中的一条记录
这是数据库元数据格式。他这个publish_time,template_id,location_id 来自哪条记录啊?是都来自一条记录还是拼接的?我对group by 多字段怎么执行是真的不太了解
@ʚ飞累的荆棘鸟√: 应该是分组前对应的第一条记录吧, 没研究过不做过多评论,
因为用group by 一般都是要获取分组后聚合函数的值
我想知道的是为什么它违反了group by语法还能正常查询?