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.

2 Solutions collect form web for “Consulta SQL para la relación de los hijos progenitores”

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.

  • La carpeta de "datos" del monitor de dispositivos Android está vacía
  • Android getColumName y getColumnIndex
  • Acceso a la aplicación de Android Lite para Android
  • ¿Cómo puedo actualizar un valor de columna de la base de datos android sqlite a null usando ContentValues?
  • Obtener cuenta con cursor.getCount () o para ejecutar un rawQuery con un COUNT en una cláusula SQL?
  • Citas simples en sqlite en android
  • ¿Cómo obtener tablas columnas arraylist en Android?
  • Cómo obtener el ID de botón de radio comprobado creado dinámicamente en android
  • Obtener información de la base de datos sqlite
  • ¿Puedo bloquear una tabla SQLite para el subproceso actual?
  • Modo offline de la aplicación android, sincronización local de la base de datos sqlite con la base de datos distante
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.