mysql - MySQL存储过程生成谱系/家谱图
问题描述
我正在尝试使用 MySQL 存储过程生成谱系 [换句话说,家谱 :)] 表....
我的架构:
CREATE TABLE `horses` (
`horse_id` int(10) NOT NULL AUTO_INCREMENT,
`horse_name` varchar(32) NOT NULL,
`SireID` int(10) DEFAULT NULL,
`DamID` int(10) DEFAULT NULL,
PRIMARY KEY (`horse_id`),
KEY `FKsire` (`SireID`),
KEY `FKdam` (`DamID`),
CONSTRAINT `FKdam` FOREIGN KEY (`DamID`) REFERENCES `horses` (`horse_id`),
CONSTRAINT `FKsire` FOREIGN KEY (`SireID`) REFERENCES `horses` (`horse_id`)
)
ps 'SireID' 和 'DamID' 代表父母 ID。我花了几天的时间来解决这个问题,搜索,试验......目前我没有任何可行的解决方案:
任何人都可以帮助在一行中生成表:(。我想构建类似这个参考的东西https://www.pedigreequery.com/malibu2
任何帮助或提示都非常感谢:),在此先感谢
解决方案
在 MySQL 中您无法做到这一点,但您可以将数据格式化为 html 标签,然后复制为纯文本,将纯文本重命名为“someName.html”,然后您可以按照您想要的方式查看它。
示例:
- 1 - 创建表
创建表人( 类别 varchar(100) ,年龄整数 ,fullName varchar(100));
- 2 - 填充表格
插入人 值('A',20,'亚历山大') ,('A', 20, '玛丽') ,('A', 25, '罗杰') ,('A', 25, '一分钱') ,('B', 21, '罗尼') ,('B', 20, '凯伦') ,('B', 25, '彼得');
- 3 - 查询
SELECT '<table><tr><th>类别</th><th>年龄</th><th>全名</th></tr>' 联合所有 选择连接('<tr>' ,IF(prevCategory IS NULL,CONCAT('<td rowspan="',q_rows_category,'">',category,'</td>'),'') ,IF(prevAge IS NULL,CONCAT('<td rowspan="',q_rows_age,'">',age,'</td>'),'') ,CONCAT('<td>',fullName,'</td>') ,'</tr>') 作为 html_body FROM (SELECT p.category,LAG(category,1) OVER(PARTITION BY p.category ORDER BY p.category,p.age) 作为 prevCategory ,LEAD(category,1) OVER(PARTITION BY p.category ORDER BY p.category,p.age) as nextCategory ,(SELECT COUNT(*) FROM person t WHERE t.category = p.category) AS q_rows_category ,p.age,LAG(age,1) OVER(PARTITION BY p.category,p.age ORDER BY p.category,p.age) 作为 prevAge ,LAG(age,1) OVER(PARTITION BY p.category,p.age ORDER BY p.category,p.age) as nextAge ,(SELECT COUNT(*) FROM person t WHERE t.category = p.category AND t.age = p.age) AS q_rows_age ,p.fullName 来自人 p) a 联合所有 选择'</table>';
- 4 - 结果
<table><tr><th>类别</th><th>年龄</th><th>全名</th></tr> <tr><td rowspan="4">A</td><td rowspan="2">20</td><td>亚历山大</td></tr> <tr><td>玛丽</td></tr> <tr><td rowspan="2">25</td><td>一分钱</td></tr> <tr><td>罗杰</td></tr> <tr><td rowspan="3">B</td><td rowspan="1">20</td><td>卡伦</td></tr> <tr><td rowspan="1">21</td><td>罗尼</td></tr> <tr><td rowspan="1">25</td><td>彼得</td></tr> </table>
- 5 - HTML 骨架
<html> <头部> <style type="text/css"> 桌子 { 宽度:50%; } td, 日{ 边框:1px 实心#000; 文本对齐:居中; } </style> </head> <正文> <中心> 在此处粘贴数据! </center> </正文> </html>
推荐阅读
- javascript - 遍历一个集合,其中键是 ID,值是用户类
- ios - 捕获视频并通过 AVAssetWriter 保存
- c# - WPF。是否有用于在 WPF 中选择字体的对话框窗口?
- java - JTabbedPane 更改侦听器以从文件中读取
- amazon-web-services - 如何在 Fn::Sub 中正确执行正则表达式
- mysql - 访问几何字段的纬度和经度
- sql-server - 测试 (90%) 和控制 (10%) 在零售商级别和 SQL 中的细分级别划分。怎么做?
- node.js - SetTimeout 和串行端口事件 - 代码执行顺序
- c++ - QPlainTextEdit 在即将删除选择时通知/挂钩
- reactjs - Reactjs setState 异步