亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程

Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程

熱門標(biāo)簽:大眾點(diǎn)評(píng)星級(jí)酒店地圖標(biāo)注 高清地圖標(biāo)注道路 話務(wù)外呼系統(tǒng)怎么樣 智能外呼系統(tǒng)復(fù)位 400電話可以辦理嗎 云南電商智能外呼系統(tǒng)價(jià)格 拉卡拉外呼系統(tǒng) 外東北地圖標(biāo)注 臨清電話機(jī)器人

1、縱表與橫表

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

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

優(yōu)缺點(diǎn):

橫表:表結(jié)構(gòu)更加的清晰明了,關(guān)聯(lián)查詢的一些sql語(yǔ)句也更容易,方便易于后續(xù)開發(fā)人員的接手,但是如果字段不夠,需要新增字段,會(huì)改動(dòng)表結(jié)構(gòu)。

縱表:擴(kuò)展性更高,如果要增加一個(gè)字段,不需要改變表結(jié)構(gòu),但是一些關(guān)聯(lián)查詢會(huì)更加麻煩,也不便于維護(hù)與后續(xù)人員接手。

平常開發(fā),盡量能用橫表就不要用縱表,維護(hù)成本比較高昂,而且一些關(guān)聯(lián)查詢也很麻煩。

2、縱表轉(zhuǎn)換為橫表

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

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'

結(jié)果:

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

注意:這里需要取出每一個(gè)字段,都要case一下,有多少個(gè)字段,就需要多少次case語(yǔ)句。因?yàn)橐粋€(gè)case語(yǔ)句,遇到符合條件的when語(yǔ)句之后,后面的會(huì)不再執(zhí)行。

(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;

 查詢的結(jié)果:

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

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

大家注意一下,我把縱表同一條記錄的公共字段 r.original_record_id 放到了group by里面,這個(gè)字段在縱表中同一條記錄相同、唯一,且永遠(yuǎn)不會(huì)改變(相當(dāng)于以前橫表的主鍵ID),然后把其他字段放到 max 中(因?yàn)槠渌侄我词窍嗤模词侨∽畲蟮木涂梢裕词侵挥幸粋€(gè)縱表記錄有數(shù)值其他記錄為空,所以這三種情況都可以直接用max),四條記錄取最大的更新時(shí)間作為同一條記錄的更新時(shí)間,在邏輯上也是合適的。然后我們把縱表字段 field_code 和 record_value 做了 max() 操作,因?yàn)橥粭l記錄里面他們都是唯一存在的,不會(huì)發(fā)生同一條數(shù)據(jù)有兩個(gè)相同的 field_code 記錄,所以這樣做 max() 也是沒有任何問(wèn)題的。

優(yōu)化點(diǎn):

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

優(yōu)化后的業(yè)務(wù)層(組裝 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、組裝動(dòng)態(tài)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、組裝動(dòng)態(tài)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、獲取老化自動(dòng)化測(cè)試項(xiàng)記錄
    PageHelper.startPage(qo.getPageNo(), qo.getPageSize());
    ListMapString, Object>> dataList = atsItemRecordDao.selectItemRecordListByCondition(qo);
    PageInfo pageInfo = new PageInfo(dataList);
    //5、組裝返回結(jié)果
    ListAtsAgingItemRecordVo> recordVoList = null;
    if (!CollectionUtils.isEmpty(dataList)) {
        recordVoList = JSONUtils.copy(dataList, AtsAgingItemRecordVo.class);
    }
    pageInfo.setList(recordVoList);
    return pageInfo;
}

優(yōu)化后的Dao層,代碼如下:

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

優(yōu)化后的SQL語(yǔ)句,代碼如下:

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>

模板字段表結(jié)構(gòu)(ats_item_field 表),如下所示:

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

記錄表結(jié)構(gòu)(ats_item_record 表),如下所示:

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

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

到此 Mysql 縱表轉(zhuǎn)換為橫表介紹完成。

總結(jié)

到此這篇關(guān)于Mysql縱表轉(zhuǎn)換為橫表的文章就介紹到這了,更多相關(guān)Mysql縱表轉(zhuǎn)換為橫表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳細(xì)聊聊MySQL中慢SQL優(yōu)化的方向
  • 淺談MySQL之select優(yōu)化方案
  • MySQL千萬(wàn)級(jí)數(shù)據(jù)表的優(yōu)化實(shí)戰(zhàn)記錄
  • MySql子查詢IN的執(zhí)行和優(yōu)化的實(shí)現(xiàn)
  • 帶你快速搞定Mysql優(yōu)化
  • mysql 數(shù)據(jù)插入優(yōu)化方法之concurrent_insert
  • mysql優(yōu)化之query_cache_limit參數(shù)說(shuō)明
  • MySQL優(yōu)化之如何寫出高質(zhì)量sql語(yǔ)句
  • mysql查詢優(yōu)化之100萬(wàn)條數(shù)據(jù)的一張表優(yōu)化方案
  • MYSQL 的10大經(jīng)典優(yōu)化案例場(chǎng)景實(shí)戰(zhàn)

標(biāo)簽:揚(yáng)州 山西 三明 定西 福州 無(wú)錫 溫州 阿里

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程》,本文關(guān)鍵詞  Mysql,縱表,轉(zhuǎn)換,為,橫表,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产一区精品| 日本特黄特色aaa大片免费| 成人免费网站视频ww| 国产成人欧美一区二区三区的| 天天做日日爱| 精品视频在线观看一区二区三区| 91麻豆爱豆果冻天美星空| 亚洲精品永久一区| 韩国三级香港三级日本三级| 国产成人欧美一区二区三区的| 国产成人精品影视| 日韩欧美一二三区| 国产亚洲精品aaa大片| 欧美a免费| 国产激情一区二区三区| 二级片在线观看| 日韩中文字幕一区| 精品国产亚洲一区二区三区| 久久久成人网| 一本高清在线| 国产美女在线一区二区三区| 久久99中文字幕| 一级毛片视频免费| 国产伦理精品| 天天色色网| 国产91素人搭讪系列天堂| 国产伦久视频免费观看视频| 日本特黄特色aaa大片免费| 精品视频在线看 | 青青久久网| 国产网站免费视频| 精品国产三级a| 日本在线播放一区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩在线观看网站| 国产亚洲免费观看| 久久99中文字幕| 国产成人精品综合久久久| 国产91精品系列在线观看| 日本免费乱理伦片在线观看2018| 日本在线播放一区| 久久国产影视免费精品| 国产福利免费观看| 99久久精品国产国产毛片| 九九久久99综合一区二区| 午夜家庭影院| 国产成人精品综合| 免费一级片在线| 99色视频在线观看| 亚洲 激情| 精品久久久久久综合网| 精品视频免费在线| 二级片在线观看| 午夜在线亚洲| 中文字幕一区二区三区 精品| 国产伦理精品| 国产一级强片在线观看| 一 级 黄 中国色 片| 日韩中文字幕一区二区不卡| 青草国产在线观看| 欧美日本免费| 日韩在线观看视频免费| 欧美a级v片不卡在线观看| 日本伦理黄色大片在线观看网站| 国产一区二区高清视频| 精品国产亚洲一区二区三区| 精品国产一区二区三区免费 | 日本特黄一级| 久久精品道一区二区三区| 久久国产影院| 欧美一区二区三区在线观看| 日韩男人天堂| 美女免费精品视频在线观看| 国产伦理精品| 四虎影视久久久| 欧美日本二区| 欧美激情一区二区三区视频 | 一级女人毛片人一女人| 成人免费网站视频ww| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久精品大片| 二级片在线观看| 日韩中文字幕一区| 精品国产三级a| 日韩欧美一二三区| 九九免费精品视频| 欧美另类videosbestsex视频| 国产91精品露脸国语对白| 国产a视频精品免费观看| 成人免费福利片在线观看| 精品视频在线观看免费| 亚洲精品影院| 午夜精品国产自在现线拍| 国产高清视频免费观看| 成人在激情在线视频| 日本特黄特黄aaaaa大片 | 国产伦久视频免费观看视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久久成人影院| 国产伦久视频免费观看视频| 午夜激情视频在线播放| 久草免费在线色站| 国产成人精品一区二区视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 999精品影视在线观看| 久久久久久久免费视频| 成人免费高清视频| 国产成人精品综合| 成人免费观看视频| 韩国三级香港三级日本三级la | 黄视频网站在线观看| 欧美日本免费| 日本在线播放一区| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 精品视频在线观看一区二区三区| a级黄色毛片免费播放视频| 久久精品店| 国产一区二区精品| 国产伦久视频免费观看视频| 四虎久久影院| 色综合久久天天综合观看| 你懂的国产精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美激情伊人| 国产伦久视频免费观看 视频| 美国一区二区三区| 国产精品自拍一区| 香蕉视频一级| 四虎久久精品国产| 午夜家庭影院| 国产网站免费| 麻豆污视频| 黄视频网站免费观看| 青青青草影院| 亚洲精品久久玖玖玖玖| 欧美另类videosbestsex久久 | 精品视频在线观看视频免费视频| 九九精品久久久久久久久| 日韩免费在线视频| 国产美女在线一区二区三区| 日韩在线观看视频黄| 亚洲不卡一区二区三区在线| 欧美爱色| 国产极品精频在线观看| 日韩一级黄色大片| 国产麻豆精品免费视频| 亚洲www美色| 国产一区二区福利久久| 国产美女在线一区二区三区| 国产麻豆精品| 日韩欧美一二三区| 一 级 黄 中国色 片| 高清一级片| 国产不卡在线看| 欧美电影免费| 亚洲天堂免费| 久久99这里只有精品国产| 国产精品1024在线永久免费| 久久99爰这里有精品国产| 日韩专区亚洲综合久久| 精品国产一区二区三区国产馆| 韩国三级视频网站| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 色综合久久久久综合体桃花网| 欧美激情伊人| 日韩中文字幕在线观看视频| 日韩在线观看免费| 韩国三级香港三级日本三级| 日本在线播放一区| 欧美国产日韩久久久| 九九久久国产精品大片| 日本免费区| 欧美激情一区二区三区视频 | 亚洲第一页色| 日韩字幕在线| 九九精品在线| 日韩av片免费播放| 精品国产一区二区三区免费 | 成人免费观看视频| 久久福利影视| 精品国产一区二区三区久| 韩国毛片免费大片| 韩国三级香港三级日本三级| 欧美大片a一级毛片视频| 精品久久久久久免费影院| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 毛片的网站| 久久久成人网| 999久久狠狠免费精品| 欧美1区| 精品久久久久久免费影院| 日韩男人天堂| 尤物视频网站在线| 精品视频一区二区| 日本特黄特黄aaaaa大片| 免费国产在线观看| 成人免费福利片在线观看| 亚洲第一页乱| 中文字幕97| 国产一区二区精品久久91|