从平面表格查询结果排序
从平面表格查询结果排序
我有一个非常基本的单一表格场景;
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
列甚至存在,我只是用它作为示例,真正重要的是entryID
和parentID
,因为它们是链接和控制所有内容的两列。除了name
之外可能还有二十个额外的列,但它们都围绕entryID
和parentID
旋转,只是链接或嵌套(哪个术语更合适)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层面这一事实,因此如果需要获取每个“对象”或可能是每个“层”的对象,则需要对数据库进行多次查询。
这将一直有效,直到一个点,那时你将更好地理解问题,并有能力使用不同的技术,或者至少了解不同解决方案之间的权衡。
可怕的奖励