mysql分组(group by)后检查是否包含某些值的学习

1 背景

开发业务使用mysql数据库时,为了扩展性通常会使用列表(纵表)。如下图,在这个表中抽象出类型和值,当类型增加后,不需要改表结构,直接插入即可。

表名:config

typevalue
1出行
1饮食
1娱乐
2饮食
2娱乐

有时候通过这类表建立配置表。初始会通过人工导入一些数据,同时要求数据必须满足某些条件,比如表中约定任意一个type都必须要有“出行”这个值。

在人工操作时,有时会发生忘记导入某些数据。从上面的例子看,就是2这个类型下缺少了出行这个值。因此需要通过SQL查询快速找到这种问题。

2 查询分组中是否包含某些值

为了解决背景中提到的问题,我们会利用group by及聚合函数来解决。还是使用背景中的例子,我们对数据按类型分组,随后查看分组中是否包含某个值。

select type,sum(value = '出行') from config 
group by type
  • 首先通过group by分组
  • 接着通过聚合函数sum[1]求出分组下value为出行的行数,sum函数入参可以是一个表达式,我们得出满足表达式的行的数量
  • 根据分析,求和后行数为0的为不满足条件的列。我们删选出后统一处理

由于条件中明确出行为必填值,那么在这个列表中我们还可以通过必填值,来找到不满足的type。我们限定好必填候选值,先看找出不包含这些候选值的列即可。 假设有多行候选数据,我们就要构造出多行数据。

  • 通过union all[2] 构造当列多行候选数据
select '出行' union all
select '饮食'
  • 查询包含候选数据的行,并去重类型type
select distinct type from config where value in
(
	select '出行' union all
	select '饮食'
)
  • 最后从所有type中取出满足条件的type得出结果

两种方式都涉及到表中列名获取,为了获取列表我们可以通过
INFORMATION_SCHEMA.COLUMNS[3]来获取列明

select * from INFORMATION_SCHEMA.COLUMNS

这种方式读取数据表的描述信息[4]来查询表结构定义。类型的还可以查询一个表的其它描述性信息。

3 总结

列表(纵表)快速检查是否包含某些数据,结合分组和聚合函数来处理。有时候也可以通过union来构造单列多行数据。为了进一步简化工作可以继读取数据表的元信息。

参考资料

[1].聚合函数sum,https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_sum
[2].mysql union,https://dev.mysql.com/doc/refman/8.0/en/union.html
[3].https://dev.mysql.com/doc/refman/8.0/en/information-schema-columns-table.html
[4]https://dev.mysql.com/doc/refman/8.0/en/information-schema.html

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用ORDER BY子句对分组后的结果进行排序。例如,可以使用以下语句对表中的数据按照age字段进行分组,并按照age字段进行升序排序: SELECT age, COUNT(*) FROM table_name GROUP BY age ORDER BY age ASC; ### 回答2: 在MySQL中,可以使用`GROUP BY`对数据进行分组,然后使用`ORDER BY`对分组结果进行排序。下面是一个示例: 假设有一个名为students的表,其中包含了学生的姓名(name)、学科(subject)和成绩(score)三个字段。我们希望按照学科对学生进行分组,并按照平均成绩对每个学科的学生进行降序排序。 ```sql SELECT subject, AVG(score) AS average_score FROM students GROUP BY subject ORDER BY average_score DESC; ``` 上述查询语句首先使用`GROUP BY subject`对学生表按照学科进行分组,并计算每个学科的平均成绩(使用AVG函数)。然后使用`ORDER BY average_score DESC`对分组结果按照平均成绩进行降序排序。 最终查询结果会按照学科分组,并按照每个学科的平均成绩降序排列出来。 这样,我们可以看到每个学科的平均成绩,并了解学科之间的成绩差距。 ### 回答3: 在MySQL中,可以使用GROUP BY函数对数据库中的数据进行分组分组后,可以通过ORDER BY子句对分组结果进行排序。 GROUP BY语句根据指定的列对数据进行分组分组后,可以对每个分组应用聚合函数,如SUM,COUNT,AVG等。语法如下: SELECT 列名1, 列名2, ... FROM 表名 GROUP BY 列名1, 列名2, ... ORDER BY 列名1, 列名2, ... 在GROUP BY子句之后,可以使用ORDER BY子句对分组结果进行排序。ORDER BY子句可指定一个或多个用于排序的列,可以使用ASC(升序)或DESC(降序)关键字来指定排序方式。 例如,如果有一个名为students的表,包含学生的姓名和成绩两列。我们想要按照成绩分组,并按照成绩降序排序,可以使用以下查询: SELECT 姓名, 成绩 FROM students GROUP BY 成绩 ORDER BY 成绩 DESC 这将返回按照成绩分组后的学生姓名和成绩,并按照成绩降序排序的结果。 总之,可以使用GROUP BY函数对数据库中的数据进行分组,并使用ORDER BY子句对分组结果进行排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值