从平面表的查询中排序结果

时间:2012-08-11 12:52:55

标签: mysql sql flat

我有一个非常基本的表格方案;

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列甚至存在,我只是以此为例,这里重要的是entryIDparentID,因为它们是链接和控制的两列一切。可能有20个额外的列以及name,但它们都围绕entryIDparentID,它只是链接或嵌套(哪个术语更合适)ID。

1 个答案:

答案 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-databasesObject-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层,因此如果需要提取,请对数据库进行多次查询每个“对象”或可能是对象的每个“层”。

这将持续到一定程度,此时您将更好地理解问题并更好地使用不同的技术,或者至少理解不同解决方案之间的权衡。

令人震惊的奖金

Cycles in family tree software