问题描述:同一列比如time,存放了早晨、中午、晚上,首先这样设计数据库存在不合理,在取这三个时间节点的数据时,需要取三次,根据where条件筛选,再将结果自连接合并。说白了,常规思路,就是自连接三次,我们知道,多次表连接这样势必造成效率低下。所以这里用到了行列转换,将行里的中午,早晨、晚上,转换成列,进行查询,并将结果返回。
备注:concat进行字段的拼接,默认使用”,”进行拼接
注意一点,由于进行了一对多的连表查询,从表数据是两条,所以多了一倍,这里进行了groupBy去重,一开始,xmjd24的那条,casewhen转义之后,一直是空的。后来想明白了,因为去重去掉了,但是不确定到底那一条有空的情况怎么办?用到了group_concat进行拼接,先用case when 进行字段判断,实现转义,如果是xmjd22的话就赋值时间,不是就用空代替;xmjd24也一样;最后将空的结果和有时间的结果进行合并,并使用SEPARATOR 将group_concat的默认逗号换成空,最后结果如下,大功告成;
在这样写之前,第一种方案:自连接执行效率是2s;第二种,分别连接一次,再将结果合并执行效率是一秒;第三种:如下,只连接一次,将结果行列转换展示,执行时间0.3s
一句话:sql是检验代码水平的关键,好的sql速度执行快,代码量少,逻辑清晰,代码简洁;
sql如下
第二种方案的sql
右下角一秒