【发布时间】:2017-05-27 23:32:18
【问题描述】:
我已经对这个问题进行了几乎完全的重写,因为我仍然卡住了......寻找一种无需使用 php 或其他一些数据解释器/编程来查看结果表中数据的方法以我希望的方式查看结果。
基本结果表是这样的(如果你愿意,可以把它弄得更乱):
id1 | id2 | name | ord
------------------------------
a1 | null | name1 | 0
a2 | null | name2 | 1
a3 | null | name3 | 2
b1 | a1 | name4 | 0
b2 | b1 | name5 | 0
b3 | a1 | name6 | 1
b4 | a1 | name7 | 2
c1 | a2 | name8 | 0
c2 | a2 | name9 | 1
d1 | a2 | name10 | 2
d2 | a2 | name11 | 3
d3 | a2 | name12 | 4
d4 | a3 | name13 | 0
c3 | d4 | name14 | 0
c4 | c3 | name15 | 1
d5 | b2 | name16 | 0
我要找的结果是这样的:
id1 | id2 | name | ord
-----------------------------
a1 | null | name1 | 0 <--group header, signified by `id2` is null
b1 | a1 | name4 | 0 <--item that's parent to line below
b2 | b1 | name5 | 0 <--item that's parent to line below
d5 | b2 | name16 | 0 <--last child item
b3 | a1 | name6 | 1 <--special case where `ord` takes over
b4 | a1 | name7 | 2 <--`id2` is still the same, so `ord` sort
a2 | null | name2 | 1 <--next group header
c1 | a2 | name8 | 0 <--`id2` is a2, so name2 is parent, `ord` sort
c2 | a2 | name9 | 1 <--same
d1 | a2 | name10 | 2 <--same
d2 | a2 | name11 | 3 <--same
d3 | a2 | name12 | 4 <--same
a3 | null | name3 | 2 <--next group header
d4 | a3 | name13 | 0 <--`id2` is a3, so name3 is parent
c3 | d4 | name14 | 0 <--`id2` is d3, so name13 is parent
c4 | c3 | name15 | 1 <--`id2` is c3, so name14 is parent
我需要什么的冗长解释
基本上,我需要id2 成为按ord 排序的“组标题”。然后在他们每个人的下方,我需要以这样一种方式对行进行排序,即id2 等于其上方行的id1,并且任何时候id2 与上方行的id2 相同,它应按ord 排序。
当id2 与最后一个id1 匹配的行用完时,应该出现下一个组标题,并且应该重新开始排序,下一个id2 匹配新组标题的id1。
id2 为空的任何项目都是组标题,但在这些组中,ord 基于“父”行重新开始。其中一些行也是其他项目的父项,因此排序的复杂性
实际结果表中还有其他列,因此我将其简化为实际进行排序所需的列。
表格数据说明
实际的id 列是 char(36),name 是 varchar(1024),ord 是 int(11),表中的其他列运行范围...我还应该提到这些结果来自JOIN,这样做是为了限制找到此数据的主表的结果。
id1 是主键并且是唯一的,与排序顺序无关,除了 id2 等于给定 id1 组标题的所有行应该出现在它的下方。
id2 是对“父行 ID”的引用,因此对于组标题它为空;它们是最父的行,并且通过ord 有自己的排序顺序。
name 实际上是作为类别名称的组标题行所期望的项目名称。
例如,假设组标题是食物组,而其他条目是食物类型。所以一个组标题会是“水果”,下一个是“蔬菜”等。它实际上是 A/V 设备,但水果可能更容易理解。
我做了什么
我在这方面的尝试已经遍及整个地图。我尝试了各种order by、field()、if(),并且我考虑过子查询,但我的技能还不能靠自己解决这个问题。我认为,如果我能指出正确的方向,我可以结合我必须得到的结果来处理。不幸的是,出于沮丧,我删除了所有半工作代码,但它可能只不过是一个 ORDER BY 和一个不工作的 CASE 声明。
要点:
- 当
id2为空时,它是一个组头,组头应按其ord字段从低到高(0、1、2)排序。 -
id1等于另一行的id2的任何行都是其父行。换言之,如果发现某行的id2等于另一行的id1,则应将其放在其下方。 - 如果存在
id2等于id1的多行,则排序应首先考虑#2,然后按ord从低到高排序。
【问题讨论】:
-
这听起来像hierarchical data。您可能需要在数据中添加一些“左”和“右”列,以便快速排序。
-
这可能是看待它的好方法。也就是说,
id1和id2可能是我的左/右,然后ord将是叶节点......谢谢你,我一定会在时间允许的时候看看!如果结果是解决方案,我会发布答案。