mysql - 对平面表的查询结果进行排序

标签 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;循环遍历所有其他记录,根据当前的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 作为这是链接和控制一切的两列。可能还有二十个额外的列以及 name,但它们都围绕 entryIDparentID,它只是链接或嵌套(哪个术语曾经更合适)ID。

最佳答案

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

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

可怕的奖金

Cycles in family tree software

关于mysql - 对平面表的查询结果进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914876/

相关文章:

mysql - 具有不同字段的两个选择查询的并集

sql - Netezza 中的配置文件

javascript - .flat() 不是函数,怎么了?

android - 没有阴影的 Material 设计按钮

javascript - 展平嵌套 json 对象

MySQL 和 HBase 优化的数据存储(1 TB)

sql - SQL Server 中的 DECODE() 函数

mysql - 告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列

mysql - SELECT 所有数据库中列的总和

mysql - #1130 - 不允许主机 ‘localhost’ 连接到此 MySQL 服务器