2017-08-24 4 views
0

Ce problème est étrange et je pense que je ne fais que penser à ce problème. J'essaie d'obtenir (récursivement) toutes les URL de page associées à un entrepreneur donné. Les trois tableaux correspondants sont les suivants:SQL/MySQL récursivement tirer de la même table

|-------------------------------------------------| 
|     client_sections     | 
|-------------------------------------------------| 
| contractor_id | reusable_section_id | 
|-------------------------------------------------| 

|--------------------------------------------------------| 
|      reusable_sections     | 
|--------------------------------------------------------| 
| reusable_category_id | reusable_section_id | 
|--------------------------------------------------------| 

|--------------------------------------------| 
|    reusable_content    | 
|--------------------------------------------| 
| reusable_section_id | page_url | 
|--------------------------------------------| 

Maintenant, voici la nécessité - La première requête est

SELECT reusable_section_id FROM client_sections where contractor_id = '119' 

Cela obtient tous les haut niveau « sections parents » - ce qui est reusable_category_id dans la tableau reusable_sections. Si je devais m'arrêter là, je l'aurais traité. Mais la mise en garde que je rencontre est que chacune de ces sections retournées "pourrait" être aussi une section parent. J'ai essayé un imbriqué SELECT et le résultat était tout simplement désastreux!

Ce que je tentais:

» Get contractor parent sections by contractor ID from client_sections table 

    » get sections by reusable_category_id = reusable_section_id in reusable_sections -- 

     » get page_url for all the sections returned (including the initial parents) 
      by reusable_section_id in reusable_content -- I am good until this point 

      » recur the last two steps with the current reusable_section_id as 
       reusable_category_id to check for children (!!#[email protected]#!!!) 

       » Finally return all pages for all sections under that contractor_id 

J'ai essayé des requêtes allant de JOINS fou s à emboîtés SELECT s en vain. J'ai lu beaucoup de messages, y compris This One. Je suis un développeur SQL compétent, je pense que ma logique est imparfaite et un simple point dans la bonne direction peut juste susciter ma créativité! Est-ce que la meilleure façon est une boucle WHILE? SELECT imbriqué? JOIN? Mon cerveau est frit! Aidez-moi?

+0

Combien de niveaux de récursivité vous attendez-vous? Si vous n'avez pas de limite, vous ne pouvez pas résoudre ce problème simplement en faisant des jointures externes à gauche. Vous aurez besoin d'une procédure stockée, ou vous devrez l'implémenter en utilisant un langage de programmation. C'est fondamentalement un arbre. –

+0

Théoriquement, il pourrait être infini .. C'est pourquoi la récursion m'a bluffé .. Je pourrais le faire avec JOINS sinon .. – Zak

+0

https://stackoverflow.com/questions/10646833/using-mysql-query-to-traverse- rows-to-make-a-récursive-tree: D. Voir ceci: https://www.slideshare.net/billkarwin/models-for-hierarchical-data –

Répondre

1

Ce que vous avez ressemble à un arbre. Si vous parlez de naviguer à travers un nombre fini de niveaux, un nombre fini de jointures externes sera suffisant.

Cependant, si vous avez un nombre infini de niveaux possibles, je ne pense pas que vous puissiez résoudre votre problème en utilisant du SQL et des jointures.

Vous devrez recourir à une procédure stockée ou à un langage de programmation (php, java, etc.). Cependant, il semble que les gens ont mis en œuvre des procédures stockées sur la façon de traverser un arbre, de sorte que vous pouvez passer par cette approche. Exemple:

Using MySQL query to traverse rows to make a recursive tree

+0

On dirait une bonne lecture .. Je vais regarder dans cela! – Zak

+0

Procédure stockée était l'astuce ... C'était une bonne lecture .. Merci! – Zak