好的概述
一般来说,您要在快速读取时间(例如,嵌套集)或快速写入时间(邻接列表)之间做出决定.通常,您最终会得到最适合您需求的以下选项组合.以下提供了一些深入阅读:
选项
我知道和一般的功能:
O(n/2)移动,插入,由于易失性编码而删除O(log n)插入,更新,删除的成本(子树的大小)LEFT(lineage, #) = '/enumerated/path')O(log n)插入,更新,删除的成本(子树的大小)在我的MySQL模式中,我有category(id, parentid, name)表
在MSSQL中,我有CTE查询(从下到上为所提供的类别ID构建一个类别树:
with CTE (id, pid, name)
as
(
select id, parentid as pid,name
from category
where id = 197
union all
select CTE.pid as id , category.parentid as pid, category.name
from CTE
inner join category
on category.id = CTE.pid
)
select * from CTE
Run Code Online (Sandbox Code Playgroud)
如何将该查询"转换"为MySQL?
当我使用CALL语句调用它时,以下过程给出了一个错误:
CREATE DEFINER=`user`@`localhost` PROCEDURE `emp_performance`(id VARCHAR(10))
BEGIN
DROP TEMPORARY TABLE IF EXISTS performance;
CREATE TEMPORARY TABLE performance AS
SELECT time_in, time_out, day FROM attendance WHERE employee_id = id;
END
Run Code Online (Sandbox Code Playgroud)
错误显示"未知表'性能'".
这是我第一次真正使用存储过程,我从谷歌获取了我的资源.我只是想弄清楚我做错了什么.
邻接列表模型的一个主要问题是我们需要为每个节点运行一个查询以获取层次结构的路径.
在嵌套集模型这个问题不存在,但是对于每个添加的节点有必要给一个MySQL更新所有其他左和右值.
我的分层数据不是静态数据,例如电子商务的产品类别.是否按层次顺序注册用户.
在我的应用程序中,虽然有许多常量用户注册,但我还需要获取分层路径,直到到达层次结构中的第一个节点.
分析我的情况,两种替代方案中的哪一种最适合我的应用?
我有一张桌子People.我希望显示一个由每个父项组成的HTML表,其中所有子项都直接位于它们之下.
_________
|People |_____________________________________________
|-------------------------------------------------------|
| id | parent | firstname | lastname |
|-------------------------------------------------------|
| 1 0 James Donovan |
| 2 0 Jeffrey Williams |
| 3 0 Emmit Herring |
| 4 2 Carol Williams |
| 5 2 Sarah Williams |
| 6 1 Nikolai Donovan |
|_______________________________________________________|
Run Code Online (Sandbox Code Playgroud)
预期产量:
________________________________________________
|Jeffrey Williams |
|------------------------------------------------|
| - Carol Williams |
| - Sarah Williams |
|________________________________________________|
|James Donovan |
|------------------------------------------------|
| - Nikolai Donovan | …Run Code Online (Sandbox Code Playgroud) Oracle提供了非常方便的功能.您可以使用以下子句创建分层查询(递归行为):
CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
Run Code Online (Sandbox Code Playgroud)
如此处所述:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm
我想知道,有没有其他已建立的RDBMS支持等效或类似的语法?或者可以使用常规SQL一般模拟这样的递归行为?
我希望能够模拟的一个很好的例子是(取自Oracle文档):
SELECT LPAD(' ', 2 * (LEVEL-1)) || last_name org_chart,
employee_id, manager_id, job_id
FROM employees
START WITH job_id = 'AD_VP'
CONNECT BY PRIOR employee_id = manager_id;
Run Code Online (Sandbox Code Playgroud)
导致:
ORG_CHART EMPLOYEE_ID MANAGER_ID JOB_ID
------------------ ----------- ---------- ----------
Kochhar 101 100 AD_VP
Greenberg 108 101 FI_MGR
Faviet 109 108 FI_ACCOUNT
Chen 110 108 FI_ACCOUNT
Sciarra 111 108 FI_ACCOUNT
Urman 112 108 FI_ACCOUNT
Popp 113 108 FI_ACCOUNT
Whalen 200 101 AD_ASST …Run Code Online (Sandbox Code Playgroud) 我想选择一个根项目,它的子项尽可能高.我更喜欢使用嵌套集模型,但这次表结构遵循邻接模型.有关嵌套集和邻接模型的更多信息.
我有一个dependencies-table,一个items-table.
依赖表
dependency_id | item_id | child_id
1 | 1 | 4
2 | 2 | 5
3 | 4 | 7
4 | 7 | 3
5 | 9 | 3
6 | 1 | 2
Run Code Online (Sandbox Code Playgroud)
物品表
item_id | name | info
1 | Item A | 1st Item
2 | Item D | 2nd Item
3 | Item C | 3rd Item
4 | Item D | 4th Item …Run Code Online (Sandbox Code Playgroud) 我有这个 MySQL表,但它需要一个查询一个评论.如果有20条评论,则会显示20条查询以显示该页面.有什么解决方案吗?是否可以编写MySQL端函数以将查询大小减少到一个?
我不太明白递归查询是如何工作的以及如何解决这个问题。我们得到了左边的表,结构看起来像右边的树:
ID | Parent 1
1 null / \
2 1 2 3
3 1 \
4 3 4
5 4 / \
6 4 5 6
7 6 \
7
Run Code Online (Sandbox Code Playgroud)
我知道如何获取每个节点的所有父节点...但我不知道如何找到树的最大深度。这意味着我必须找出这棵树有多少层。我们没有得到更多信息
如果你能给我一个 mysql 的解决方案,我将非常感激,但是任何 sql 语句都会帮助我解决这个问题
提前致谢!
mysql ×7
sql ×5
php ×3
tree ×2
connect-by ×1
database ×1
html ×1
oracle ×1
recursion ×1
simulation ×1
sql-server ×1