当前位置: 首页 > 面试题库 >

MySQL根据父ID排序类别

刁星渊
2023-03-14
问题内容

这是表结构

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

上表显示升序I​​D,后跟与该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

现在注意,BMWid值为 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支随机数的,我发现了一些数据未排序。但是,它仍然设法对大多数整数进行排序。 随机结果: 问题答案: 这是一个巧合(不是真的,而是与哈希算法有关)。 尝试添加 最后。 输