这是表结构
id parent_id name
1 0 BMW
2 0 Mercedez
3 0 Porsche
4 1 3 Series
5 2 E60
6 1 5 Series
7 3 Cayenne
我如何将表格显示为
BMW
3 Series
5 Series
Mercedez
E60
Porsche
Cayenne
上表显示升序ID,后跟与该ID相关联的parent_id,然后转到第二个ID,依此类推。我需要在单个查询中,是否可以这样做?
试试这个:
SELECT
name,
CASE WHEN parent_id = 0 THEN id ELSE parent_id END AS Sort
FROM
cars
ORDER BY
Sort,
id
http://sqlfiddle.com/#!2/9b05f/3
鉴于这个答案一直在不断增加,我重新考虑了这个问题并发现了一个缺陷。如果由于某种原因,父级的ID高于子级的ID,则排序会混乱。仅当父ID的数字小于所有子ID的数字时,以上查询才有效。
为了演示该问题,假设表看起来像这样:
id parent_id name
8 0 BMW
2 0 Mercedez
3 0 Porsche
4 8 3 Series
5 2 E60
6 8 5 Series
7 3 Cayenne
现在注意,BMW
其id
值为 8 而不是 1 。结果将如下所示:
Mercedez
E60
Porsche
Cayenne
3 Series
5 Series
BMW
注意上面的内容, 宝马 在 它的孩子 之后
出现在列表的底部!这是因为,的二级排序顺序是id
,如果父ID恰好高于任何子代,则父代可能不会出现在子代之上。
此查询将解决该问题:
SELECT
name
FROM
cars
ORDER BY
CASE WHEN parent_id = 0 THEN id ELSE parent_id END, -- another way of writing it: ISNULL(NULLIF(parent_id, 0), id)
parent_id,
id
http://sqlfiddle.com/#!2/6d6d73/3
为了解释这里发生的情况,您首先按父行的id
字段和子行的parent_id
字段排序。如果按此顺序排序,则所有子项都将与其父级分组,并且整个列表将按父级id
字段排序。
但这并没有设置家庭内部的排序,因此父母可以出现在家庭中的任何地方(父母可以出现在顶部,或者可以出现在中间,或者可以是最后)。
这就是其他两个排序字段的输入位置。第二个字段按排序parent_id
,并且父行的parent_id
字段始终为0
。安全地假设您的ID字段始终为正,这意味着父记录将始终显示在家族的顶部。其余所有孩子的值都相同parent_id
,因此第三个排序字段按其id
字段对家庭中的孩子进行排序。也可以将其更改为name
,具体取决于您希望孩子如何分类。
问题内容: 是否可以使用预定义的一组列值(ID)按“ order by”在mysql中排序,例如:order by(ID = 1,5,4,3),因此我会在其中得到记录1、5、4、3订购吗? 更新: 关于滥用mysql ;-)我必须解释为什么我需要这个… 我希望记录每5分钟随机更改一次。我有一个cron任务来执行更新表,以在其中放置不同的随机排序顺序。只有一个问题!分页。我将有一位访问者来到我的页面
问题内容: 在这里可以找到很多类似的问题,但是我认为没有一个人能够充分回答这个问题。 如果可以的话,我将继续从当前最受欢迎的问题开始,并使用其示例。 本例中的任务是获取数据库中每个作者的最新帖子。 该示例查询产生不可用的结果,因为它并不总是返回最新的帖子。 当前接受的答案是 不幸的是,这个答案是简单而简单的错误,并且在许多情况下产生的结果比原始查询更不稳定。 我最好的解决方案是使用形式的子查询 我
问题内容: 我有一个集合,一个对象(无序) 的ID 属性,一个(有序)列表 的ID 。 ID列表未排序 。我想在我的收藏夹中创建一个对象列表,并根据ID列表进行排序。 我在Guava或Apache Commons中没有看到用于此目的的方法-但这正是我想要的。具有良好实现的库函数。 问题答案: 听起来您的ID列表有自己的顺序;您不仅在使用自然顺序,对吗? 这是番石榴解决方案: 而已。没什么 (公开:
问题内容: 我正在使用map接口从文件中读取,然后将其中的值存储为键值对。文件格式如下 我将从该文件中读取数据并将其存储为键值对,然后将其显示给用户。我的要求是以这种格式显示结果 因此,我需要按值的降序对地图进行排序。这样我就可以将它们显示为我的结果..我已经阅读了有关此内容并找到了以下代码 我希望这将按升序对值进行排序,我只想知道此方法是否正确,或者其他有效方法对我有帮助? 问题答案: 由于您可
请创建一个算法,它获取一个类列表,并以某种方式对它们进行排序 > A类是B类的子类 A类实现接口B B 的索引小于 A。 到目前为止我尝试的是, 我不确定这是否有效。
问题内容: 该中应该是未排序,但被相对于分类。 我遇到了这个问题,因为我需要插入顺序数据。因此,我改用了。但是我还是很困惑为什么要对它进行排序。 有人可以解释吗? 我做了一个简单的例子来查看排序。 结果: 编辑: 我试图插入使用50支随机数的,我发现了一些数据未排序。但是,它仍然设法对大多数整数进行排序。 随机结果: 问题答案: 这是一个巧合(不是真的,而是与哈希算法有关)。 尝试添加 最后。 输