首页 > 解决方案 > 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

任何帮助或提示都非常感谢:),在此先感谢

标签: mysqlsqlstored-procedures

解决方案


在 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>

  • 6 - 查看结果 最终数据示例

推荐阅读