关于mysql:从平面表的查询中排序结果

Order results from a query of a flat table

我有一个非常基本的单表场景;

1
2
3
4
tblFamiles
entryID : Int
name: Text
parentID: Int

让我们添加以下行:

1
2
3
4
5
6
7
8
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那样,所以它们是相对顺序的。我想要这样的输出;

1
2
3
4
5
6
7
8
9
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;循环访问所有其他记录,根据当前entryid检查它们的parentid字段,并将这些记录置于当前行下结果集的顶部。但我不知道如何在MySQL中做到这一点。

更新

我已经使用了Families作为上面的例子,但是我所追求的是一种方法,它存储嵌套的条目,并将它们放在一个查询中,以提高效率。我可以提出多个SELECT问题,但那会很难看;

1
2
3
4
5
6
7
8
(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。


"但我不知道如何在MySQL中做到这一点。"

简短的回答

你不能。

回答稍微长一点。

您试图解决的问题不是关系数据库能够很好地解决的问题。您要做的是需要一个对象关系数据库。

对于这一理论,我建议阅读两者的区别:

http://en.wikipedia.org/wiki/relational_数据库

http://en.wikipedia.org/wiki/object-relational_数据库

还有关于stackoverflow的问题,关于为什么每个都是好的/坏的。

https://stackoverflow.com/questions/800/object-oriented-vs-relational-databases或关系数据库中面向对象的类结构

包括以下答案:https://stackoverflow.com/a/600765/778719计算机科学的越南。

实际上,这更多的是关于对象映射到关系数据库,但它确实向您展示了您刚刚遇到的问题的深度(以及缺乏明显的解决方案)。

在实际需要另一个时使用一个的实际问题称为对象关系阻抗不匹配。http://en.wikipedia.org/wiki/object-relationalu阻抗不匹配

实际上可能有用的答案

您描述的问题是最好由对象处理的问题。我建议暂时将它们存储在关系数据库中,只接受这样一个事实:您的逻辑需要存在于应用程序代码层,而不是SQL层,因此,如果需要获取每个"对象"或可能每个"层"的对象,可以对数据库进行多次查询。

这将一直持续到某一时刻,在这一时刻,您将更好地理解问题,并处于更好的位置,可以使用不同的技术,或者至少了解不同解决方案之间的权衡。

可怕的奖金

家族树软件中的循环