告别硬编码,mysql 如何实现按某字段的不同取值进行统计
上周我突然意识到,我在grafana上写的 sql 语句存在多处硬编码。这篇笔记将记录如何实现没有硬编码的sql语句,以及自学编程过程中如何应对自己的笨拙代码和难题不断的状况。
1、有效但粗笨的硬编码
所谓硬编码,大意是指代码中出现很多具体的取值,每个取值都是手动赋值的。比如:
-- 达成某个成就的用户数
select
count(user_id) as 用户数
from
achivement_table
where
achivement_name= '牛刀小试'
以我家产品 xue.cn 的成就系统为例,我们首个版本仅有10个成就,我要拷贝粘贴修改成就名称达10次。最近成就升级到V2版本,有17个成就,未来还会有更多成就。再比如习题和章节,每本书的章节数和习题数,都是几十个起。至于统计每本书的阅读用户数,每个章节的留言数,每个成就的达成用户数……这类实现太频繁了。
如果全部采用硬编码,我意识到这将低效粗笨。
在初学编程时,你我总会写出一些低效但生效的代码。随着编程水平提升或需求变得复杂,我们将有机会迭代自己的代码。迭代是好事,但这不意味着之前的低效但有效的代码是坏事。——接纳自己早期的笨拙,并追求持续的进步。咱们不需要为自己初学阶段的代码感到不好意思或羞愧,而是要视之为提升的机会。这个心态令我在自学编程的路上几乎无所畏惧。
2、知道,但用时忘
如何实现代码自动获取每个取值,并按该值分别统计呢?我搜索到一些代码,却看不懂:

不得已,我准备好问题描述,并发红包在编程学习群里请教。群友给出的答案让我哭笑不得:
特么这方法我不是会吗!?鬼打墙啦。
这种现象在初学技能时,是不是挺常见的!?知道,但不熟练。知道知识点,但实战时可能想不起来。或者知道某一种实战情境,换到其它实战情境就忘了……嗯,本质上还是重复的不够,熟练度不行啊。

既然是我已知的知识点,立即实操吧。
情境A:字段取值范围在同一表格
想要统计的原数据,和该字段的所有取值范围,在同一张数据表时,代码简单如下。
-- 所有成就的完成用户数
select
achivement_name as 成就名称,
count(user_id) as 用户数
from
achivement_table
group by
成就名称
order by
成就名称
情境B:字段取值范围在另一表格
想要统计的原数据,和该字段的所有取值范围,不在同一张数据表时,代码仅稍微复杂一点点。
-- 所有成就的完成用户数
select
achivements.name as 成就名称,
count(achivement_event.user_id) as 用户数
from
achivement_event,achivements
where
achivement_event.name = achivements.name
group by
成就名称
order by
成就名称
3、解决一个难题,新的困惑到来
硬编码的问题现在倒是解决了,但实现数据可视化时,又有新的情况产生。
之前的硬编码风格,在 grafana 上通过 add query 完成,该操作是新增数据列,使得数据结果是一行多列,每个成就名就是一列。


这种数据,用 grafana 的 bar gauge 图表类型展示效果很不错。

之后没有硬编码的sql语句,得到的数据结果是多行2列,首列是成就名,次列是用户数。相当于之前数据结果的倒置。
行列倒置在 python pandas中,就是对dataframe数据一个T操作而已。但在 grafana 上如何灵活地操作行列,我还有不少困惑要解决。——这并非我的不足,这是我将要提升的机会,对不?
小结
在这篇笔记中,我不仅记录了自己如何完成按某个字段的取值范围进行统计的需求,既有早期的硬编码风格,也有升级版的语句。我还分享了自己如何看待初学编程时的笨拙代码,如何应对一个难题接着一个难题的编程自学过程。希望我的笔记,带给你启发和力量。
告别硬编码,mysql 如何实现按某字段的不同取值进行统计的更多相关文章
- 告别硬编码-发个获取未导出函数地址的Dll及源码
还在为找内核未导出函数地址而苦恼嘛? 还在为硬编码通用性差而不爽吗? 还在为暴搜内核老蓝屏而痛苦吗? 请看这里: 最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的 ...
- 告别硬编码,让你的POI导入导出拥抱变化
GitHub地址 | 博客 | 中文 | English | 原文链接 为什么使用AutoExcel? Excel导入导出在软件开发中非常常见,只要你接触过开发,就一定会遇到.相信很多人会跟我一样选择 ...
- Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密码硬编码)
继续对Fortify的漏洞进行总结,本篇主要针对 Dynamic Code Evaluation: Code Injection(动态脚本注入) 和 Password Management: Har ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- 使用VideoToolbox硬编码H.264<转>
文/落影loyinglin(简书作者)原文链接:http://www.jianshu.com/p/37784e363b8a著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. ======= ...
- 【Android】Android Camera实时数据采集及通过MediaCodec硬编码编码数据的流程
吐槽: 其实常用流程都差不多,但是有时候还是会忘记某一步的详细用法,但是各位朋友请注意,官方已经不推荐Camera类的使用(现在是android.hardware.camera2),但无奈公司项目之前 ...
- Mysql编码, Mysql编码流程, Mysql编码顺序, Mysql编码原理, Mysql编码修改依据
编码查看方式以及解释说明: 需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root –p,之后两次输入root用户的密码),查看数据库的 ...
- android studio 中查找代码中的硬编码
在Android Studio中同时按下Ctrl + Shift+ F 或者其他自定义的快捷键,打开全局搜索,在全局搜索中输入 ^((?!(\*|//)).)+[\u4e00-\u9fa5] 并打勾 ...
- 【GPU编解码】GPU硬编码
一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. int main(int argc, ...
随机推荐
- Angular4+Koa2+MongoDB开发个人博客
**文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号.** xml文件实现多线程测试
package com.course.testng.thread; import org.testng.annotations.Test; public class ThreadOnXml { @Te ...
- 自动更新Aria2中的bt-trackers选项
#!/bin/bash /usr/sbin/service aria2 stop list=`wget -qO- https://raw.githubusercontent.com/ngosang/t ...
- 01 (OC)* @property 后面可以有哪些修饰符?
一:@property 后面可以有哪些修饰符? 1:线程安全的: atomic,nonatomic 2:访问权限的 readonly,readwrite 3:内存管理(ARC) assign, cop ...
- Salesforce学习之路-developer篇(一)利用VS Code结合Git开发Salesforce
Part 1: 从Git中克隆代码到本地 git clone https://github.com/git/git Part 2: 在VS Code中安装Salesforce和Git插件 在VS Co ...
- Introduction to ES6上课笔记
课程链接:https://scrimba.com/g/gintrotoes6 这个网站有几个热门的前端技术栈的免费课程,上课体验除了英语渣只能看代码理解听老师讲的一知半解之外,是极佳的学编程的网站了. ...
- 格子游戏Grid game CodeForce#1104C 模拟
题目链接:Grid game 题目原文 You are given a 4x4 grid. You play a game — there is a sequence of tiles, each o ...
- Java假期样卷 简易通讯录
score.java package score; public class score { String name; String num; int age; boolean sex; double ...
- .net core中使用Bumblebee架设微服务网关
Bumblebee是款基于.net core开发开源的http服务网关,经过最近版本的完善在功能足以满足作为微服务网关的需要.在微服务网关功能中它提供了应用服务负载,故障迁移,安全控制,监控跟踪和日志 ...
- 在vue的mounted下使用setInterval的误区
1. vue对象的生命周期 1). 初始化显示(只执行一次) * beforeCreate() * created() * beforeMount() * mounted() 2). 更新状态(可执行 ...