android - 父子关系的SQL查询

标签 android sqlite

我正在尝试在波纹管表上编写一个 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     ║
╚════╩══════════╩═══════╝======╝======╝

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

╔════╦════════╦═══════╗======╗======╗
║ 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] 

那么我尝试了什么?

SELECT * FROM user group by ID, PARENT ;

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

然后我尝试连接并以两个完全不同的表结束,其中一个包含所有 parent ,另一个包含所有 child 。 UNION ALL 对这两个查询返回了预期的数据集,但未按预期顺序返回。

有什么想法吗?

更新

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

注意:

--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

SQL Fiddle

Similar on 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;

返回以下输出:

╔════╦════════╦═══════╗======╗======╗
║ ID ║ NAME   ║ CLASS ║PARENT║ DOB  ║
╠════╬════════╬═══════╣======║======║
║ 1  ║  DAVID ║ SPIN  ║      ║1     ║
║ 2  ║  AROON ║ BIKE  ║ 1    ║1     ║
║ 4  ║  LIN   ║ CYC   ║ 1    ║2     ║
║ 5  ║  GLORIA║ RUNN  ║ 1    ║3     ║
╚════╩════════╩═══════╝======╝======╝

输出对第一个 parent 有利。但是,仍然无法弄清楚,我怎样才能按排序顺序遍历其余的 parent 和他们的 child 。

最佳答案

查询

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;

解释

  1. 别名 u1 包含所有用户详细信息
  2. Alias u2 包含父级的详细信息(如适用)。 (使用了 LEFT JOIN,因此如果 u1 用户没有父级,这些详细信息将全部为 null。)
  3. 如果用户没有 parent ,则单独使用其 DOB 进行订购。
  4. 如果用户有 parent ,则获取用户 parent 的 DOB 并连接(追加)用户( child )的 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      ║
╚════╩════════╩═══════╝======╝======╩════════╝

演示

参见 SQL Fiddle Demo .

关于android - 父子关系的SQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736610/

相关文章:

android - QPython - 读取文件

java - 数据库更新和可排序 JTable 问题

java - 如何在android本地数据库中存储intent?

java - 从美国到瑞典的 SimpleDateFormat 时间转换不适用于真实设备,但适用于模拟器

fragment 内的 Android setShareIntent

c - 我应该如何在 C 中使用 Sqlite "PRAGMA integrity_check"

C++ SQL 清理库或提供清理功能的查询生成器

c# - 使用 SQLiteConnection.Delete(object) 命令和 sqlite-net orm 后更改 sqlite 文件大小

java - Android Studio 0.5.7 不会在操作栏中显示按钮

java - 调试时是否可以更改 android 上的所有者(用户)?