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
- ¿Cómo comunicarse entre WebView y JavaScript?
- Aplicación de diccionario androide con base de datos sin conexión
- Error: Asegúrese de que el cursor se inicializa correctamente antes de acceder a los datos de él?
- GreenAno QueryBuilder concatena dinámicamente las condiciones
- ActiveAndroid: columnas de fecha no creadas
╔════╦════════╦═══════╗======╗======╗ ║ 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.
- Evitar duplicar la entrada en la base de datos sqllite android
- Android sqlite cómo comprobar si existe un registro
- Android: ¿Cómo acceder a una sola base de datos de múltiples actividades en la aplicación?
- Cómo obtener el valor de la base de datos en una matriz String en android (sqlite Database)
- Formatear un entero a una fecha formateada en una instrucción SQLite select
- ¿Cómo manejas los registros de antememoria de caché en la aplicación para móviles
- Cursor de Android con ORMLite para usar en CursorAdapter
- Búsqueda en varias columnas mediante búsqueda de texto completo (FTS) con varios tokens utilizando el operador OR
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
- Alias
u1
tiene todos los detalles de usuario - Alias
u2
tiene detalles del padre, cuando proceda. (ALEFT JOIN
se utiliza para que todos estos detalles seannull
si el usuariou1
no tiene un padre). - Si el usuario no tiene un padre, utilice su DOB por sí solo para ordenar.
- 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.
- Cómo utilizar las bibliotecas en AIDE
- "Tiempo de espera pendiente de la respuesta del anuncio", al intentar agregar admob a mi aplicación