父子关系的SQL查询

min*_*haz 7 sqlite android

我想在波纹管表上写一个sql查询.

?????????????????????????======?======?
? ID ?   NAME   ? CLASS ?PARENT? DOB  ?
?????????????????????????======?======?
? 1  ?   DAVID  ? SPIN  ?      ?1     ?
? 2  ?   AROON  ? BIKE  ? 1    ?1     ?
? 3  ?   LEO    ? YOGA  ?      ?2     ?
? 4  ?   LIN    ? CYC   ? 1    ?2     ?
? 5  ?   STEFA  ? YOGA  ?      ?3     ?
? 6  ?   GLORIA ? RUNN  ? 1    ?3     ?
?????????????????????????======?======?
Run Code Online (Sandbox Code Playgroud)

并且,此表的输出应如下所示

???????????????????????======?======?
? ID ? NAME   ? CLASS ?PARENT? DOB  ?
???????????????????????======?======?
? 1  ?  DAVID ? SPIN  ?      ?1     ?
? 2  ?  AROON ? BIKE  ? 1    ?1     ?
? 4  ?  LIN   ? CYC   ? 1    ?2     ?
? 6  ?  GLORIA? RUNN  ? 1    ?3     ?
? 3  ?  LEO   ? YOGA  ?      ?2     ?
? 5  ?  STEFAN? YOGA  ?      ?3     ?
???????????????????????======?======?

So this is the explanation of the output
First parent David as his DOB is 1, 
--David three childrens sorted based on DOB
Then LEO as his DOB is 2
-- Leo do not have children[if he did, would be here as sorted on DOB] 
Then Stefan as his DOB is 3
--  Stefan do not have children [if he did, would be here as sorted on DOB] 
Run Code Online (Sandbox Code Playgroud)

那我试过了什么?

SELECT * FROM user group by ID, PARENT ;
Run Code Online (Sandbox Code Playgroud)

在SQL上面,父子组中的语句返回项但不保持任何顺序,当我添加时ORDER BY,SQL似乎不再尊重GROUP BY.

然后我尝试加入并以两个完整的不同表结束,其中一个包含所有父项,另一个包含所有子项. UNION ALL在那两个查询返回预期的数据集但不是预期的顺序.

有什么想法吗?

UPDATE

Output should be
Pick entry [based on min time ].  
--use that id and find all of its children and placed them in sorted order
repeat for every row in the table
Run Code Online (Sandbox Code Playgroud)

注意:

--parents are sorted based on DOB
--child's are also sorted based on DOB 
--DOB are valid timestamp 
--PARENT, ID field both are UUID and define as CHAR, PARENT reference to ID
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

类似于SO

更新1

查询下面

WITH RECURSIVE
top AS (
    SELECT * FROM (SELECT * FROM user WHERE PARENT is null ORDER BY dob LIMIT 1) 
    UNION
    SELECT user.NAME, user.PARENT, user.ID, user.CLASS, user.DOB FROM user, top WHERE user.PARENT=top.ID 
    ORDER BY user.dob
  ) SELECT * FROM top;
Run Code Online (Sandbox Code Playgroud)

返回以下输出:

???????????????????????======?======?
? ID ? NAME   ? CLASS ?PARENT? DOB  ?
???????????????????????======?======?
? 1  ?  DAVID ? SPIN  ?      ?1     ?
? 2  ?  AROON ? BIKE  ? 1    ?1     ?
? 4  ?  LIN   ? CYC   ? 1    ?2     ?
? 5  ?  GLORIA? RUNN  ? 1    ?3     ?
???????????????????????======?======?
Run Code Online (Sandbox Code Playgroud)

输出对第一个父母有好处.但是,仍然无法弄清楚,我怎么能按顺序迭代其余的父母和他们的孩子.

Ste*_*ers 5

询问

SELECT u1.*
FROM `user` u1
LEFT JOIN `user` u2
ON u1.PARENT = u2.ID
ORDER BY CASE WHEN u1.PARENT IS NULL THEN u1.DOB ELSE u2.DOB END
      || CASE WHEN u1.PARENT IS NULL THEN '' ELSE u1.DOB END;
Run Code Online (Sandbox Code Playgroud)

说明

  1. Alias u1拥有所有用户详细信息
  2. Alias u2在适用的地方有父母的详细信息.(如果用户没有父母,LEFT JOIN则使用A 以便这些细节都是.)nullu1
  3. 如果用户没有父级,请单独使用其DOB进行排序.
  4. 如果用户具有父级,则获取用户父级的DOB并连接(附加)用户(子级)的DOB.

结果

以前构造的值ORDER BY(实际上并不需要SELECT)看起来像这里最右边的列:

???????????????????????======?======??????????
? ID ? NAME   ? CLASS ?PARENT? DOB  ?ORDER BY?
???????????????????????======?======??????????
? 1  ?  DAVID ? SPIN  ?      ?1     ? 1      ?
? 2  ?  AROON ? BIKE  ? 1    ?1     ? 11     ?
? 4  ?  LIN   ? CYC   ? 1    ?2     ? 12     ?
? 6  ?  GLORIA? RUNN  ? 1    ?3     ? 13     ?
? 3  ?  LEO   ? YOGA  ?      ?2     ? 2      ?
? 5  ?  STEFAN? YOGA  ?      ?3     ? 3      ?
???????????????????????======?======??????????
Run Code Online (Sandbox Code Playgroud)

演示

请参阅SQL Fiddle演示.