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

2020-07-24 22:18:29 +08:00
 aizya

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

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

表头  |表头 | 表头| 
张三  |12 岁 | 男 |
上海  |徐汇区|xx 街道|
江苏  |南京 | xx 街道|
李四  |34 岁 | 男 | 
湖北  |武汉 | xx 街道|
....
1720 次点击
所在节点    MySQL
4 条回复
allAboutDbmss
2020-07-24 23:24:57 +08:00
没看特别明白
给个输出的例子吧
ysoserious
2020-07-25 13:00:28 +08:00
关键词 join

输出结果

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

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

伪代码:

```
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();


```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692915

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX