我想在波纹管表上写一个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)
更新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)
输出对第一个父母有好处.但是,仍然无法弄清楚,我怎么能按顺序迭代其余的父母和他们的孩子.
询问
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)
说明
u1拥有所有用户详细信息u2在适用的地方有父母的详细信息.(如果用户没有父母,LEFT JOIN则使用A 以便这些细节都是.)nullu1结果
以前构造的值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演示.
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |