婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Mysql縱表轉換為橫表的方法及優化教程

Mysql縱表轉換為橫表的方法及優化教程

熱門標簽:大眾點評星級酒店地圖標注 高清地圖標注道路 話務外呼系統怎么樣 智能外呼系統復位 400電話可以辦理嗎 云南電商智能外呼系統價格 拉卡拉外呼系統 外東北地圖標注 臨清電話機器人

1、縱表與橫表

縱表:表中字段與字段的值采用key—value形式,即表中定義兩個字段,其中一個字段里存放的是字段名稱,另一個字段中存放的是這個字段名稱代表的字段的值。

例如,下面這張ats_item_record表,其中field_code表示字段,后面的record_value表示這個字段的值

優缺點:

橫表:表結構更加的清晰明了,關聯查詢的一些sql語句也更容易,方便易于后續開發人員的接手,但是如果字段不夠,需要新增字段,會改動表結構。

縱表:擴展性更高,如果要增加一個字段,不需要改變表結構,但是一些關聯查詢會更加麻煩,也不便于維護與后續人員接手。

平常開發,盡量能用橫表就不要用縱表,維護成本比較高昂,而且一些關聯查詢也很麻煩。

2、縱表轉換為橫表

(1)第一步,我們先把這些字段名以及相應字段的值從縱表中取出來

select r.original_record_id,r.did,r.device_sn,r.mac_address,r.record_time, r.updated_time updated_time,
(case r.field_code when 'accumulated_cooking_time' then r.record_value else '' end ) accumulated_cooking_time,
(case r.field_code when 'data_version' then r.record_value else '' end) data_version,
(case r.field_code when 'loop_num' then r.record_value else '' end) loop_num,
(case r.field_code when 'status' then r.record_value else '' end) status
from ats_item_record r 
where item_code = 'GONGMO_AGING'

結果:

 通過 case 語句,成功把字段從縱表中取出,但是此時仍算不上一個橫表,我們這里的original_record_id 是記錄同一行數據的唯一ID,我們這里可以通過這個字段把上面這四行合成一行記錄。

注意:這里需要取出每一個字段,都要case一下,有多少個字段,就需要多少次case語句。因為一個case語句,遇到符合條件的when語句之后,后面的會不再執行。

(2)分組,合并相同行,生成橫表

select * from (
	select r.original_record_id,
    max(r.did) did,
    max(r.device_sn) device_sn,
    max(r.mac_address) mac_address,
    max(r.record_time) record_time,
	max(r.updated_time) updated_time,
	max((case r.field_code when 'accumulated_cooking_time' then r.record_value else '' end )) accumulated_cooking_time,
	max((case r.field_code when 'data_version' then r.record_value else '' end)) data_version,
	max((case r.field_code when 'loop_num' then r.record_value else '' end)) loop_num,
	max((case r.field_code when 'status' then r.record_value else '' end)) status
	from ats_item_record r 
	where item_code = 'GONGMO_AGING'
	group by r.original_record_id
) m order by m.updated_time desc;

 查詢的結果:

注意:這里采用group by 分組的時候,需要給字段加上max函數。用group by 分組的時候,一般搭配聚合函數使用,常見的聚合函數:

  • AVG() 求平均數
  • COUNT() 求列的總數
  • MAX() 求最大值
  • MIN() 求最小值
  • SUM() 求和

大家注意一下,我把縱表同一條記錄的公共字段 r.original_record_id 放到了group by里面,這個字段在縱表中同一條記錄相同、唯一,且永遠不會改變(相當于以前橫表的主鍵ID),然后把其他字段放到 max 中(因為其他字段要么是相同的,要么是取最大的就可以,要么是只有一個縱表記錄有數值其他記錄為空,所以這三種情況都可以直接用max),四條記錄取最大的更新時間作為同一條記錄的更新時間,在邏輯上也是合適的。然后我們把縱表字段 field_code 和 record_value 做了 max() 操作,因為同一條記錄里面他們都是唯一存在的,不會發生同一條數據有兩個相同的 field_code 記錄,所以這樣做 max() 也是沒有任何問題的。

優化點:

最后這個SQL是可以優化一下的,我們可以把模板字段(r.original_record_id,r.did,r.device_sn,r.mac_address,r.record_time 等),從專門存放模板字段表中全部取出來(同一個邏輯縱表的字段全部取出),然后再代碼里面拼接好我們的 max() 部分,作為參數拼接進去執行,這樣可以做到通用,每次如果新增加模板字段,我們不需要更改這個SQL語句了(中國移動他們存放手機的參數數據就是這么干的)。

優化后的業務層(組裝 SQL 模板的代碼),代碼如下:

@Override
public PageInfoAtsAgingItemRecordVo> getAgingItemList(AtsItemRecordQo qo) {
    //1、獲取工模老化字段模板
    LambdaQueryWrapperAtsItemFieldPo> queryWrapper = Wrappers.lambdaQuery();
    queryWrapper.eq(AtsItemFieldPo::getItemCode, AtsItemCodeConstant.GONGMO_AGING.getCode());
    ListAtsItemFieldPo> fieldPoList = atsItemFieldDao.selectList(queryWrapper);
    //2、組裝查詢條件
    ListString> tplList = Lists.newArrayList(), conditionList = Lists.newArrayList(), validList = Lists.newArrayList();
    if (!CollectionUtils.isEmpty(fieldPoList)) {
        //3、組裝動態max查詢字段
        for (AtsItemFieldPo itemFieldPo : fieldPoList) {
            tplList.add("max((case r.field_code when '" + itemFieldPo.getFieldCode() + "' then r.record_value else '' end )) " + itemFieldPo.getFieldCode());
            validList.add(itemFieldPo.getFieldCode());
        }
        qo.setTplList(tplList);
        //4、組裝動態where查詢條件
        if (StringUtils.isNotBlank(qo.getDid())) {
            conditionList.add("AND did like CONCAT('%'," + qo.getDid() + ",'%')");
        }
        if (validList.contains("batch_code")  StringUtils.isNotBlank(qo.getBatchCode())) {
            conditionList.add("AND batch_code like CONCAT('%'," + qo.getBatchCode() + ",'%')");
        }
        qo.setConditionList(conditionList);
    }
    qo.setItemCode(AtsItemCodeConstant.GONGMO_AGING.getCode());
    //4、獲取老化自動化測試項記錄
    PageHelper.startPage(qo.getPageNo(), qo.getPageSize());
    ListMapString, Object>> dataList = atsItemRecordDao.selectItemRecordListByCondition(qo);
    PageInfo pageInfo = new PageInfo(dataList);
    //5、組裝返回結果
    ListAtsAgingItemRecordVo> recordVoList = null;
    if (!CollectionUtils.isEmpty(dataList)) {
        recordVoList = JSONUtils.copy(dataList, AtsAgingItemRecordVo.class);
    }
    pageInfo.setList(recordVoList);
    return pageInfo;
}

優化后的Dao層,代碼如下:

public interface AtsItemRecordDao extends BaseMapperAtsItemRecordPo> {
 
    ListMapString, Object>> selectItemRecordListByCondition(AtsItemRecordQo qo);
}

優化后的SQL語句,代碼如下:

select id="selectItemRecordListByCondition" resultType="java.util.HashMap"
        parameterType="com.galanz.iot.ops.restapi.model.qo.AtsItemRecordQo">
    SELECT * FROM (
        SELECT r.original_record_id id,
        max(r.did) did,
        max(r.device_sn) device_sn,
        max(r.updated_time) updated_time,
        max(r.record_time) record_time,
        if test="tplList != null and tplList.size() > 0">
            foreach collection="tplList" item="tpl" index="index" separator=",">
                ${tpl}
            /foreach>
        /if>
        FROM ats_item_record r
        WHERE item_code = #{itemCode}
        GROUP BY r.original_record_id
    ) m
    where>
        if test="conditionList != null and conditionList.size() > 0">
            foreach collection="conditionList" item="condition" index="index">
                ${condition}
            /foreach>
        /if>
    /where>
    ORDER BY m.updated_time DESC
/select>

模板字段表結構(ats_item_field 表),如下所示:

字段名 類型 長度 注釋
id bigint 20 主鍵ID
field_code varchar 32 字段編碼
field_name varchar 32 字段名稱
remark varchar 512 備注
created_by bigint 20 創建人ID
created_time datetime 0 創建時間
updated_by bigint 20 更新人ID
updated_time datetime 0 更新時間

記錄表結構(ats_item_record 表),如下所示:

字段名 類型 長度 注釋
id bigint 20 主鍵ID
did varchar 64 設備唯一ID
device_sn varchar 32 設備sn
mac_address varchar 32 設備Mac地址
field_code varchar 32 字段編碼
original_record_id varchar 64 原始記錄ID
record_value varchar 32 記錄值
created_by bigint 20 創建人ID
created_time datetime 0 創建時間
updated_by bigint 20 更新人ID
updated_time datetime 0 更新時間

注:original_record_id 是縱轉橫表后,每條記錄的唯一ID,可以看做我們普通橫表的主鍵ID一樣的東西

到此 Mysql 縱表轉換為橫表介紹完成。

總結

到此這篇關于Mysql縱表轉換為橫表的文章就介紹到這了,更多相關Mysql縱表轉換為橫表內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳細聊聊MySQL中慢SQL優化的方向
  • 淺談MySQL之select優化方案
  • MySQL千萬級數據表的優化實戰記錄
  • MySql子查詢IN的執行和優化的實現
  • 帶你快速搞定Mysql優化
  • mysql 數據插入優化方法之concurrent_insert
  • mysql優化之query_cache_limit參數說明
  • MySQL優化之如何寫出高質量sql語句
  • mysql查詢優化之100萬條數據的一張表優化方案
  • MYSQL 的10大經典優化案例場景實戰

標簽:揚州 山西 三明 定西 福州 無錫 溫州 阿里

巨人網絡通訊聲明:本文標題《Mysql縱表轉換為橫表的方法及優化教程》,本文關鍵詞  Mysql,縱表,轉換,為,橫表,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Mysql縱表轉換為橫表的方法及優化教程》相關的同類信息!
  • 本頁收集關于Mysql縱表轉換為橫表的方法及優化教程的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲一区二区五区| 国产精品一区二区91| 欧美视频一区二区三区在线观看| 狠狠色狠狠色综合系列| 精品久久久久99| 26uuu亚洲综合色欧美| 欧美影院一区二区| 色八戒一区二区三区| 日韩午夜精品视频| 亚洲精品中文在线影院| 国产成人av一区二区| 欧美日韩一区国产| 久久综合九色综合97婷婷女人| 亚洲人成在线观看一区二区| 精品系列免费在线观看| 日韩国产欧美在线观看| 亚洲一区在线看| 免费欧美日韩国产三级电影| 国产精品高潮久久久久无| 中文字幕免费一区| 日韩电影网1区2区| 亚洲777理论| 94-欧美-setu| 97久久人人超碰| 日韩一级黄色大片| 亚洲黄色av一区| 国产麻豆精品久久一二三| 不卡一区二区中文字幕| 欧美色倩网站大全免费| 久久伊人蜜桃av一区二区| 亚洲女同女同女同女同女同69| 亚洲第一搞黄网站| 色婷婷亚洲一区二区三区| 欧美v国产在线一区二区三区| 国产精品久久久久久久久久免费看 | ...xxx性欧美| 国产乱码精品一区二区三区av| 一本色道久久综合亚洲精品按摩| 欧美一区国产二区| 亚洲第一电影网| 欧美日韩综合不卡| 五月天激情综合网| 色婷婷av一区二区| 亚洲激情在线播放| 欧美午夜电影在线播放| 一区二区三区欧美在线观看| 色偷偷久久一区二区三区| 国产精品国产三级国产aⅴ原创 | 色婷婷亚洲婷婷| 一区二区三区高清在线| 欧美亚州韩日在线看免费版国语版| 最好看的中文字幕久久| 91猫先生在线| 五月婷婷激情综合网| 日韩欧美一区二区三区在线| 青青草97国产精品免费观看无弹窗版| 欧美日韩一区二区欧美激情| 亚洲自拍偷拍综合| 一区二区三区四区蜜桃| 欧美影院一区二区三区| 黑人精品欧美一区二区蜜桃| 久久久av毛片精品| 在线视频观看一区| 蜜臀av一区二区在线免费观看| 欧美日韩免费观看一区二区三区| 日韩免费高清电影| 成人免费黄色在线| 日韩和欧美一区二区三区| 国产亚洲人成网站| 69久久99精品久久久久婷婷| 国产一区二区三区免费| 亚洲国产精品激情在线观看| 在线中文字幕一区二区| 午夜精彩视频在线观看不卡| 久久你懂得1024| 99国产麻豆精品| 精一区二区三区| 亚洲美女一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩日日骚| 99久久精品情趣| 国产精品99久久久久久宅男| 午夜精品国产更新| 一区二区在线观看av| 久久久久9999亚洲精品| 欧美tk丨vk视频| 欧美电视剧在线观看完整版| eeuss鲁片一区二区三区| 狠狠色狠狠色综合系列| 精品在线播放午夜| 一区二区三区四区不卡在线 | 中文字幕一区二区三区av| 欧美va亚洲va香蕉在线| 日本韩国精品在线| 91蝌蚪porny| 91视频精品在这里| 99riav久久精品riav| 91麻豆国产福利精品| 一本色道**综合亚洲精品蜜桃冫| 国产sm精品调教视频网站| 国产成人免费视频网站| 国产成+人+日韩+欧美+亚洲| 国产精品亚洲第一| 91网站最新网址| 91传媒视频在线播放| 欧美综合欧美视频| 久久精品亚洲精品国产欧美| 国产精品成人一区二区艾草 | 一区2区3区在线看| 福利视频网站一区二区三区| 99视频一区二区| 欧美色精品天天在线观看视频| 91精品国产免费久久综合| 亚洲欧洲日本在线| 韩国av一区二区三区| 91麻豆国产自产在线观看| 日韩精品中文字幕在线一区| 国产蜜臀97一区二区三区| 亚洲国产日韩在线一区模特| 成人av影院在线| 亚洲国产成人一区二区三区| 五月天丁香久久| 一本久道中文字幕精品亚洲嫩| 国产片一区二区| 国产一区二区三区高清播放| 欧美高清性hdvideosex| 亚洲不卡av一区二区三区| 91在线高清观看| 一区二区视频在线看| 欧美影视一区在线| 亚洲一二三四久久| 欧美日韩一区三区| 国产在线视视频有精品| 久久综合久久综合久久综合| 九九国产精品视频| 国产精品乱码久久久久久| av在线播放一区二区三区| 欧美国产精品一区二区三区| 成人午夜av在线| **欧美大码日韩| 3d动漫精品啪啪| 国产麻豆精品在线观看| 中文字幕一区二区三区色视频| 91麻豆免费在线观看| 美女网站色91| 亚洲欧美日韩在线| 日韩女优毛片在线| 91麻豆高清视频| 麻豆91精品91久久久的内涵| 国产欧美va欧美不卡在线| 91国产免费看| 精品一区二区三区在线播放视频 | 欧美午夜影院一区| 国产成人精品午夜视频免费| 亚洲国产视频在线| 亚洲人xxxx| 综合久久国产九一剧情麻豆| 日韩精品一区二区在线| 欧美视频完全免费看| 91亚洲精品久久久蜜桃| 成人午夜电影小说| a级高清视频欧美日韩| 99re66热这里只有精品3直播| 91 com成人网| 久久精品久久99精品久久| 亚洲另类色综合网站| 国产精品少妇自拍| 国产精品传媒视频| 国产精品伦理一区二区| 欧美一区二区三区视频在线| 色婷婷av一区二区三区之一色屋| 成人自拍视频在线观看| 国产精品资源在线观看| 成人午夜视频福利| 91福利国产成人精品照片| 色乱码一区二区三区88| 欧美色综合网站| 久久精品水蜜桃av综合天堂| 久久久五月婷婷| 亚洲美女偷拍久久| 轻轻草成人在线| 国产福利精品导航| 欧美日韩激情在线| 中文字幕免费不卡| 日韩中文字幕一区二区三区| 亚洲成年人网站在线观看| 青青草国产精品97视觉盛宴| 国产高清在线精品| 欧美天堂亚洲电影院在线播放| 56国语精品自产拍在线观看| 精品不卡在线视频| 午夜欧美2019年伦理| 国产高清在线精品| 日韩免费看的电影| 亚洲免费av高清| fc2成人免费人成在线观看播放 | 99麻豆久久久国产精品免费 | 午夜视频在线观看一区二区三区| 久久国产精品99久久人人澡| 欧美军同video69gay|