› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
aizya
V2EX  ›  MySQL

有两张关联的数据表,想请教一下使用 SQL 能实现类似树状形式展示吗?

  •  
  •   aizya · Jul 24, 2020 · 2516 views
    This topic created in 2257 days ago, the information mentioned may be changed or developed.

    现在有一张用户表, 一张地址表, 地址表中有用户的主键.

    请问现在想实现每条用户记录之间要放入多个地址信息, 假定从两张表中获取的列是相同的, 请问可以类似 Tree 的形式吗? 如果可以,能不能告知一下搜索的关键词.MySQL/Oracle 求教.

    表头  |表头 | 表头| 
    张三  |12 岁 | 男 |
    上海  |徐汇区|xx 街道|
    江苏  |南京 | xx 街道|
    李四  |34 岁 | 男 | 
    湖北  |武汉 | xx 街道|
    ....
    
    4 replies  •  2020-07-30 10:52:37 +08:00
    allAboutDbmss
        1
    allAboutDbmss  
       Jul 24, 2020
    没看特别明白
    给个输出的例子吧
    ysoserious
        2
    ysoserious  
       Jul 25, 2020
    关键词 join

    输出结果

    表头 |表头 | 表头| 表头 | 表头 | 表头 |
    张三 |12 岁 | 男 | 上海 |徐汇区 | xx 街道|
    张三 |12 岁 | 男 | 江苏 |南京 | xx 街道|
    李四 |34 岁 | 男 | 湖北 |武汉 | xx 街道|

    ----
    如果必须要用数据库语句输出你那种结构的话, 可以试试 MySQL 的存储过程.
    aizya
        3
    aizya  
    OP
       Jul 25, 2020
    @ysoserious 非常感谢, 存储过程感觉也不好写. 我先找找存储过程有没有类似代码的处理方式, 先查主表,然后循环主表内容查子表,然后再拼接..
    aizya
        4
    aizya  
    OP
       Jul 30, 2020
    结贴了, 最后是研究存储过程搞定了. 通过游标和临时表, 最终实现了功能.

    伪代码:

    ```
    DROP PROCEDURE IF EXISTS COMBINE_RESULT_SET;

    CREATE PROCEDURE COMBINE_RESULT_SET()
    BEGIN
    -- 定义要在 DROP TABLE 的前面, 要显示在最前面
    DECLARE s INT DEFAULT 0;
    DECLARE TASKID INT(11);
    -- 定义游标,并将 SQL 结果集赋值到游标中
    DECLARE IDLIST CURSOR FOR SELECT ID FROM PL_TASK;

    -- 声明当游标遍历完后将标志变量置成某个值
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;

    -- SQL Error [1337] [42000]: Variable or condition declaration after cursor or handler declaration


    DROP TABLE IF EXISTS USER_TEMPORARY;
    -- 创建临时表
    CREATE TEMPORARY TABLE IF NOT EXISTS USER_TEMPORARY(NAME VARCHAR(32), DESCRIPTION VARCHAR(225));
    -- 打开游标
    OPEN IDLIST;
    -- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和 SQL 结果列的顺序一致
    FETCH IDLIST INTO TASKID;

    -- 当 S 不等于 1,也就是未遍历完时,会一直循环
    WHILE s<>1 DO
    -- 执行业务逻辑
    -- INSERT INTO USER_TEMPORARY(NAME, DESCRIPTION) VALUES (SELECT USER_NAME, EMAIL FROM PL_USER WHERE PL_USER.ID = TASKID) ;
    -- INSERT INTO USER_TEMPORARY(NAME, DESCRIPTION) VALUES (SELECT TASK_NO, TASK_TITLE FROM PL_TASK WHERE CREATE_BY = TASKID) ;
    INSERT INTO USER_TEMPORARY(SELECT USER_NAME, EMAIL FROM PL_USER WHERE PL_USER.ID = TASKID) ;
    INSERT INTO USER_TEMPORARY(SELECT TASK_NO, TASK_TITLE FROM PL_TASK WHERE CREATE_BY = TASKID) ;
    -- 将游标中的值再赋值给变量,供下次循环使用
    FETCH IDLIST INTO TASKID;
    -- 当 S 等于 1 时表明遍历以完成,退出循环
    END WHILE;
    -- 关闭游标
    CLOSE IDLIST;
    SELECT * FROM USER_TEMPORARY;
    END

    CALL COMBINE_RESULT_SET();


    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4984 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:20 · PVG 09:20 · LAX 18:20 · JFK 21:20
    ♥ Do have faith in what you're doing.