Consulta SQL para la relación de los hijos progenitores

Estoy tratando de escribir una consulta SQL en la siguiente tabla.

╔════╦══════════╦═══════╗======╗======╗ ║ 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 ║ ╚════╩══════════╩═══════╝======╝======╝ 

Y, la salida para esta tabla debe ser como siguiente

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

Entonces, ¿qué he intentado?

 SELECT * FROM user group by ID, PARENT ; 

Por encima de SQL, los elementos de devolución de sentencia en el grupo de hijos de padres, pero no no mantiene ningún orden, cuando agrego ORDER BY , SQL no parece más honrar a GROUP BY.

Entonces traté de unirme y terminar con dos tablas completas diferentes donde uno contiene todos los padres y otro contiene todos los niños. UNION ALL en esa consulta dos devolvió el conjunto de datos esperados pero no en el orden esperado.

¿Alguna idea?

ACTUALIZAR

 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 

Nota:

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

Actualización 1

Pregunta debajo

 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; 

Devolviendo la siguiente salida:

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

La salida es buena para el primer padre. Pero, todavía no podía entender, ¿cómo puedo iterar a través del resto de los padres y sus hijos en orden ordenado.

Consulta

 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; 

Explicación

  1. Alias u1 tiene todos los detalles de usuario
  2. Alias u2 tiene detalles del padre, cuando proceda. (A LEFT JOIN se utiliza para que todos estos detalles sean null si el usuario u1 no tiene un padre).
  3. Si el usuario no tiene un padre, utilice su DOB por sí solo para ordenar.
  4. Si el usuario tiene un padre, tome el DOB del padre del usuario y concatene (agregue) el DOB del usuario (hijo).

Resultados

Los valores construidos usados ​​para ORDER BY (que en realidad no son necesarios en SELECT ) parecen la columna más a la derecha aquí:

 ╔════╦════════╦═══════╗======╗======╦════════╗ ║ 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 ║ ╚════╩════════╩═══════╝======╝======╩════════╝ 

Manifestación

Consulte Demostración de SQL Fiddle .

Aquí hay una ORDER BY que creo que es lógicamente correcta:

 ORDER BY COALESCE(PARENT, DOB) ASC, CASE WHEN PARENT IS NULL THEN 0 ELSE DOB END 

Esta respuesta supone, por supuesto, que puede utilizar las columnas PARENT y DOB en su consulta. Por lo general, no debe SELECT columnas que no son agregados o se especifican en la cláusula GROUP BY .

Si PARENT y DOB se definen como varchar , puede intentar transmitirlos a un tipo numérico:

 CAST(PARENT as integer) 

Es posible que desee cambiar su diseño de tabla para que estos UUID sean de tipo numérico.

  • Eliminar todas las filas de tabla de la tabla de base de datos SQLite
  • Los datos se rellenan de la fecha de una tabla en particular en lugar de toda la tabla en sqlite
  • ¿Cómo deshabilitar el archivo de diario SQLite de SQL?
  • Mostrar datos SQLite en RecyclerView
  • ¿Cómo puedo actualizar un valor de columna de la base de datos android sqlite a null usando ContentValues?
  • ¿El depurador de Android trunca mensajes de depuración?
  • ¿Está bien usar la clase estática de "ayudante de base de datos"?
  • Transacción de la base de datos Android
  • Cómo leer la base de datos de otra aplicación
  • ¿Por qué ContentValues ​​tiene un método put que admite booleanos?
  • Android / SQLite - Operación de bits en la cláusula WHERE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.