背景:项目需要使用clickhouse及mysql数据库,且两个库中的表需要关联查询。
一.MySQL中使用 group by
说明:理论上select 所查询的列 都需要加在group by 后面,或者使用sum()、min()等聚合函数
1.MySQL中使用group by 查询时 可以通过MySQL sql_model设置是否可以查询未使用聚合函数的列。
sql_model设置值 ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。
如果没有定义sql_model值,MySQL可以查询 不在group by 后面的列或者没有使用聚合函数的列。
MySQL有一个机制,如果要查询的列不在group by 后,它会获取 分组内 主键id 排序的第一个数据,所以平时我们查询时会发现未使用聚合函数的列也能查询,如:
这里面id、count列都使用了聚合函数,table_hash、sqltype_1则在group by后,而table_name和schema_name字段即不在group by后也没有使用聚合函数。
2.MySQL 在分组查询时提供了一个 分组拼接函数group_concat(),可以将组内指定的字段拼接起来。如:
二、clickhouse 中使用
1.clickhouse 中有MySQL引擎,可以创建连接进行查询,有表函数方式(mysql | ClickHouse文档)和库引擎(MySQL | ClickHouse文档)两种方式使用。
2.clickhouse中强制规定了 如果使用group by 进行分组,那select 后查询的字段必须在group by后或者使用了聚合函数。但是clickhouse 也提供了一种兼容MySQL写法的函数--> any()函数(此处附加clickhouse文档地址any | ClickHouse文档),any()函数 会获取不在group by 后的字段 在分组查询结果中第一个出现的结果(是不是和MySQL中未使用聚合函数列处理很相似!!!)。如:
3.在clickhouse中也提供了 等同于MySQL中group_concat()的函数,如下:
groupUniqArray()等同于mysql中的 group_concat(distinct ..)
arrayStringConcat()等同于group_concat 子语句中的separator '-' 语句
countEqual() 则统计数组中元素出现的次数
最后,再次附加clickhouse官方文档,真的很好用^_^