0

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

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 对结果进行排序(但不只是像普通 old 一样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;循环遍历所有其他记录,根据当前 entryID 检查它们的 parentID 字段,并将这些记录带到结果集的顶部,在当前行下。但我看不到如何在 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。

4

1 回答 1

1

“但我看不到如何在 MySQL 中做到这一点。”

简短的回答

你不能。

稍微长一点的回答。

您要解决的问题并不是关系数据库是解决问题的好方法。您尝试做的将需要一个对象关系数据库。

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

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关系数据库中的面向对象的结构

包括这个答案https://stackoverflow.com/a/600765/778719导致 计算机科学的越南

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

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

实际上可能有用的答案

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

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

可怕的奖金

家谱软件中的循环

于 2012-08-11T14:18:49.820 回答