从平面表格查询结果排序

23 浏览
0 Comments

从平面表格查询结果排序

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

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

这里我们存储了两个家庭的三代人,Jones家族和Thompson家族(作为示例)。我想查询这个表格,但是按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,因为它们是链接和控制所有内容的两列。除了name之外可能还有二十个额外的列,但它们都围绕entryIDparentID旋转,只是链接或嵌套(哪个术语更合适)ID。

admin 更改状态以发布 2023年5月20日
0
0 Comments

"但我不知道如何在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
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层面这一事实,因此如果需要获取每个“对象”或可能是每个“层”的对象,则需要对数据库进行多次查询。

这将一直有效,直到一个点,那时你将更好地理解问题,并有能力使用不同的技术,或者至少了解不同解决方案之间的权衡。

可怕的奖励

家谱软件中的循环

0