Necesito contar cuántos consultants están usando una skill a través de una tabla de combinación ( consultant_skills ), y el desafío es sumar recursivamente las ocurrencias de los niños a los padres.
Aquí está la reproducción de lo que estoy tratando de lograr. Los resultados actuales son:
skill_id | count 2 | 2 3 | 1 5 | 1 6 | 1Pero necesito calcular el conteo de los padres recursivamente, donde el resultado esperado sería:
skill_id | count 1 | 2 2 | 2 3 | 1 4 | 2 5 | 2 6 | 1¿Alguien sabe cómo puedo hacer eso?
Debe usar WITH RECURSIVE , como sugiere Mike. Su respuesta es útil, especialmente en referencia al uso de distinct para eliminar recuentos redundantes para consultores, pero no conduce a los resultados exactos que está buscando.
Vea la solución de trabajo en el sqlfiddle anterior. Creo que esto es lo que estás buscando:
WITH RECURSIVE results(skill_id, parent_id, consultant_id) AS ( SELECT skills.id as skill_id, parent_id, consultant_id FROM consultant_skills JOIN skills on skill_id = skills.id UNION ALL SELECT skills.id as skill_id, skills.parent_id as parent_id, consultant_id FROM results JOIN skills on results.parent_id = skills.id ) SELECT skill_id, count(distinct consultant_id) from results GROUP BY skill_id ORDER BY skill_id Lo que sucede en la consulta debajo de UNION ALL es que estamos uniendo recursivamente la tabla de habilidades a sí misma, pero rotando la identificación principal anterior como la nueva identificación de habilidad y usando la nueva identificación principal en cada iteración. La recursividad se detiene porque eventualmente la identificación principal es NULL y no hay JOIN porque es una unión INTERNA. Espero que tenga sentido.