我有一个非常基本的表格方案;
tblFamiles
entryID : Int
name: Text
parentID: Int
让我们添加以下行;
entryID : name : parentID
1 : Grandmother Jones : 0
2 : Grandmother Thompson : 0
3 : Mother Jones : 1
4 : Mother Thompson : 2
5 : 1st Daughter Jones : 3
6 : 2nd Daughter Jones : 3
7 : 1st Daughter Thompson : 4
在这里,我们有三代两个家庭存储,琼斯家族和汤普森家族(作为例证)。我想查询这个表,但是通过parentID对结果进行排序(但不仅仅是普通的ORDER BY 'parentID' DESC
,所以它们是相对的顺序。我想要这样的输出;
SELECT (SOME MAGIC) FROM `tblFamiles`;
entryID : name : parentID
1 : Grandmother Jones : 0
3 : Mother Jones : 1
5 : 1st Daughter Jones : 3
6 : 2nd Daughter Jones : 3
2 : Grandmother Thompson : 0
4 : Mother Thompson : 2
7 : 1st Daughter Thompson : 4
逻辑上,我可以看到如何执行此操作的唯一方法是遍历所有entryID,然后遍历每个entryID;循环遍历所有其他记录,检查其parentID字段与当前entryID,并将这些记录带到当前行下的结果集的顶部。但我无法在MySQL中看到如何做到这一点。
更新
我上面使用过系列作为例子,但我所追求的是一种存储嵌套条目并将它们放在一个查询中的方法,以提高效率。我可以做多个SELECT
查询,但这很难看;
(Pseudo)
SELECT entryID, name WHERE parentID = 0 LIMIT 0,1;
print name;
Sub query:
SELECT entryID, name WHERE parentID = $above-entryID
print name;
(Keep looping through this till the second query returns no results,
then go back to the first query and move onto the next entryID)
第二次更新
您可以忘记name
列甚至存在,我只是以此为例,这里重要的是entryID
和parentID
,因为它们是链接和控制的两列一切。可能有20个额外的列以及name
,但它们都围绕entryID
和parentID
,它只是链接或嵌套(哪个术语更合适)ID。
答案 0 :(得分:1)
“但我无法在MySQL中看到如何做到这一点。”
简短回答
你不能。
答案稍长。
您尝试解决的问题不是关系数据库是解决问题的好方法。你要做的是需要一个Object-relational数据库。
对于理论我建议阅读两者之间的区别:
http://en.wikipedia.org/wiki/Relational_database
http://en.wikipedia.org/wiki/Object-relational_database
关于stackoverflow的问题以及每个好/坏的原因。
https://stackoverflow.com/questions/800/object-oriented-vs-relational-databases或 Object-oriented-like structures in relational databases
包括这个导致的答案https://stackoverflow.com/a/600765/778719 The Vietnam of Computer Science
这实际上更多的是关于对象映射到关系数据库,但它确实向您展示了刚刚遇到的问题的深度(以及缺乏明显的解决方案)。
当您实际需要另一个时使用一个实际问题称为对象关系阻抗不匹配 http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
实际上可能有用的答案
您描述的问题是最好由对象处理的问题。我建议暂时将它们存储在关系数据库中,只需接受这样一个事实,即你的逻辑需要存在于应用程序代码层,而不是SQL层,因此如果需要提取,请对数据库进行多次查询每个“对象”或可能是对象的每个“层”。
这将持续到一定程度,此时您将更好地理解问题并更好地使用不同的技术,或者至少理解不同解决方案之间的权衡。
令人震惊的奖金