MySQL多表數(shù)據(jù)實現(xiàn)行轉(zhuǎn)列,是一種將多張表中的行數(shù)據(jù)轉(zhuǎn)化為列數(shù)據(jù)的方法,常應(yīng)用于數(shù)據(jù)錄入、數(shù)據(jù)統(tǒng)計等工作中。以下是詳細(xì)的實現(xiàn)步驟:
第一步:創(chuàng)建基礎(chǔ)表
CREATE TABLE `basic` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `name` varchar(50) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年齡', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='基礎(chǔ)表';
第二步:創(chuàng)建擴(kuò)展表
CREATE TABLE `extend` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID', `basic_id` int(11) NOT NULL COMMENT '基礎(chǔ)表ID', `attribute_key_name` varchar(50) DEFAULT NULL COMMENT '屬性名稱', `attribute_value` varchar(50) DEFAULT NULL COMMENT '屬性值', PRIMARY KEY (`id`), KEY `basic_id` (`basic_id`), CONSTRAINT `extend_basic_fk` FOREIGN KEY (`basic_id`) REFERENCES `basic` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='擴(kuò)展表';
通過以上兩張表的建立,我們建立了一個基礎(chǔ)表basic和擴(kuò)展表extend。
第三步:插入數(shù)據(jù)
INSERT INTO `basic` (`name`, `age`) VALUES ('張三', 20), ('李四', 21), ('王五', 22), ('趙六', 23); INSERT INTO `extend` (`basic_id`, `attribute_key_name`, `attribute_value`) VALUES (1, '性別', '男'), (1, '學(xué)歷', '本科'), (2, '性別', '女'), (2, '學(xué)歷', '碩士'), (3, '性別', '男'), (3, '學(xué)歷', '博士'), (4, '性別', '女'), (4, '學(xué)歷', '本科');
我們在基礎(chǔ)表中插入了四條數(shù)據(jù),每條數(shù)據(jù)都是一個人的基本信息,然后在擴(kuò)展表中插入了每個人的性別和學(xué)歷兩個屬性和屬性值。
第四步:查詢轉(zhuǎn)化后的數(shù)據(jù)
SELECT b.`name`, MAX(CASE WHEN e.`attribute_key_name` = '性別' THEN e.`attribute_value` ELSE NULL END) AS '性別', MAX(CASE WHEN e.`attribute_key_name` = '學(xué)歷' THEN e.`attribute_value` ELSE NULL END) AS '學(xué)歷' FROM basic b JOIN extend e ON b.`id` = e.`basic_id` GROUP BY b.`id` ORDER BY b.`id` ASC;
以上查詢語句會輸出如下結(jié)果:
name | 性別 | 學(xué)歷 |
---|---|---|
張三 | 男 | 本科 |
李四 | 女 | 碩士 |
王五 | 男 | 博士 |
趙六 | 女 | 本科 |
通過以上步驟,我們已經(jīng)成功實現(xiàn)了將擴(kuò)展表中的行數(shù)據(jù)轉(zhuǎn)化為列數(shù)據(jù),并與基礎(chǔ)表進(jìn)行了關(guān)聯(lián)查詢。