michellc 发表于 2016-10-23 07:21:29

基于的MySQL纵向属性列表转换为横向字段列表脚本

  内容摘自 http://git.oschina.net/xautlx/nutch-ajax 抓取数据持久化处理设计
  MySQL解析数据存储
  为了适应不同项目对不同感兴趣属性的解析存储,数据存储结构采用纵向的属性列表方式,即一个url页面多个属性存储多条记录方式,并且按照text,html,data,num几大典型类型分别对应存储。
  创建UTF-8字符集的nutch数据库,并执行表初始化脚本,参考DDL:

CREATE TABLE `crawl_data` (
`url` varchar(255) NOT NULL,
`code` varchar(255) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`category` varchar(255) DEFAULT NULL,
`order_index` int(255) DEFAULT NULL,
`fetch_time` datetime NOT NULL,
`text_value` text,
`html_value` text,
`date_value` datetime DEFAULT NULL,
`num_value` decimal(18,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


  为了一般在业务系统获取同一个url的多个属性或友好查询显示,参考如下MySQL脚本实现把纵向的属性列表属性转换为横向的多列显示模式。网上有 相关参考脚本大多是基于数字字段sum汇总等模式的纵转横SQL脚本,本项目需求是单一的基于字符串信息转换,经过一段摸索最后找到基于 GROUP_CONCAT可以实现:

    SELECT url ,fetch_time,
GROUP_CONCAT(CASE WHENcode = 'domain'THENtext_value ELSEnullEND)   AS`domain`,
GROUP_CONCAT(CASE WHENcode = 'name'THENtext_value ELSEnullEND)   AS`name`,
GROUP_CONCAT(CASE WHENcode = 'brand'THENtext_value ELSEnullEND)   AS`brand`,
GROUP_CONCAT(CASE WHENcode = 'category'THENtext_value ELSEnullEND)   AS`category`,
GROUP_CONCAT(CASE WHENcode = 'purpose'THENtext_value ELSEnullEND)   AS`purpose`,
GROUP_CONCAT(CASE WHENcode = 'price'THENnum_value ELSEnullEND)   AS`price`,
GROUP_CONCAT(CASE WHENcode = 'refPrice'THENnum_value ELSEnullEND)   AS`refPrice`,
GROUP_CONCAT(CASE WHENcode = 'primaryImage'THENtext_value ELSEnullEND)   AS`primaryImage`
FROM crawl_data GROUP BY url,fetch_time

页: [1]
查看完整版本: 基于的MySQL纵向属性列表转换为横向字段列表脚本