数据库同一列插入多行值分别取出问题/行列转换

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

右下角一秒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值