回答

收藏

MySQL根据父ID排序类别

技术问答 技术问答 424 人阅读 | 0 人回复 | 2023-09-14

这是表结构
. ]( Z; ?/ n' r: {7 r; p, K( sid   parent_id   name          BMW2                                                                                                                                                                                                                 Mercedez3                Porsche 4   1          3  3                                            3 3 3     3                                                                                                                 Series5   2                                            E606            5   5       5       5                5 5 5 5         5      5   5      5               5                      5 5  5 5  5  5 5  5   5  5     5   5  5 5                                             5 5 5 5 5  5 5 5 5 5 5 5 5 5 5 5 5 5                                                                      5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5  5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 Series 7 3                                                                                                                                                                                                                                                                                     Cayenne如何将表格显示为
/ G% ^0 y2 f( k; TBMW3 Series5 SeriesMercedezE60PorscheCayenne上表显示升序ID,后跟与该ID相关联的parent_id,然后转到第二个ID,以此类推。我需要在单个查询中这样做吗?
$ W8 {! J7 u- L2 C" `" c8 J# E+ j+ ~                                                               
, Q6 t# s  @" ^    解决方案:                                                               
1 a' N! l% M& U& w" X# N% m' F                                                                试试这个:& Z9 G, N4 t  m. n8 c" U0 B
SELECT  name, CASE WHEN parent_id = 0 THEN id ELSE parent_id END AS SortFROM  carsORDER BY  Sort, idhttp://sqlfiddle.com/#!2/9b05f/33 z1 O( p/ v% c/ {
编辑:鉴于答案的不断增加,我重新考虑了这个问题,发现了一个缺陷。如果出于某种原因,父级ID高于子级的ID,则排序会混乱。仅当父ID数字小于所有子ID以上查询有效。
8 A/ O$ e! N, F4 E; C) Y假设表看起来像这样展示这个问题:
! D% V, {  ?- }) S" y( oid   parent_id   name 8                                                                                                                                                                                                                                                                                                                                                                    BMW2                                                                                                                                                                                                                 Mercedez3                Porsche 4  8            3  3   3                                     Series5   2                                            E606   8         5   5   5                     5 5 5 5 5    5            5  5  5    5       5   5                              5 5  5  5 5  5 5 5  5 5  5    5   5  5  5                                         5 5 5 5 5 5 5  5 5 5 5 5 5 5 5 5  5 5 5 5                               5 5 5 5 5                         5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 Series 7 3                                                                                                                                                                                                                                                                                     Cayenne现在注意,BMW其id值为 8    而不是 1    。结果如下:0 \( N; J& b5 a4 X( v; w  c5 v
MercedezE60PorscheCayenne3 Series5 SeriesBMW注意以上内容,宝马    在    它的孩子 之后. ~/ w# S$ g5 V+ [
出现在列表的底部!这是因为二级排序顺序是id,如果父ID如果恰好高于任何子代,父代可能不会出现在子代之上。( s7 [8 B% J+ n2 M0 n
这个查询将解决这个问题:
! h3 y" k6 r4 H; m, vSELECT  nameFROM  carsORDER 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, idhttp://sqlfiddle.com/#!2/6d6d73/3
+ ]* [& H& h6 A9 R6 u9 E) Y: X为了解释这里发生的事情,你首先按照父行的要求id字段和子行parent_id字段排序。如果按此顺序排序,所有子项将与其父级分组,整个列表将按父级分组id字段排序。
6 g- N2 z7 A  k6 w3 t9 Y然而,家庭内部排名没有设置,因此父母可以出现在家庭的任何地方(父母可以出现在顶部、中间或最后)。# V7 }. h/ i" m: J8 c9 B
这是另外两个排序字段的输入位置。第二个字段按顺序排序parent_id,并且父行的parent_id字段总是0。安全假设你ID字段始终为正,这意味着父记录将始终显示在家族的顶部。其余所有孩子的值都相同parent_id,因此,第三个排序字段按其排序id对家庭中的孩子进行字段排序。也可以改为name,这取决于你想要的孩子如何分类。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则