[Mysql] Une requete qui me bloque

Bonsoir,
j’explique mon probleme :
j’ai deux tables « cl_cours » et « cl_cours_categ »

Cl_cours : id, id_parent, nom ( le rest on s’n fou )

Cl_cours_categ : id,categ,nom ( et le reste on s’en fou aussi)

J’explique mon probleme : le but est donc de « trier » les cours proposé sur une page en fonction de ce qui passe par l’url

exemple ( pas approprié mais bon il convient parfaitement pour l’exemple )

[code]Exemple pour la base cl_cours_categ :

id id_parent nom
1 0 C++
2 1 Objets
3 2 Heritage
4 2 Abstraction
5 3 Classes filles[/code]

Imaginons que dans l’url j’ai un id qui se balade, il correspond à C++ ( ça serait donc 1 ici :stuck_out_tongue: )
je voudrais une requete qui me permette de choper tous les « enfants » de la catégorie C++ sans bouriner en php derriere.

Je suis donc à la recherche d’une solution mysql … je pense pouvoir bricoler un truc en PHP mais ça serait vraiment crade.

heeelp :stuck_out_tongue:

merci d’avance

Fser (qui pique les signatures de LoneWolf1)^w^w en galere avec mysql

Bah apparement tu n’as pas besoin de faire grand chose d’autre qu’une jointure à la sauce qui te plaiera.

Je t’avoue que j’ai pas bien pigé l’exemple, et en plus j’ai l’impression qu’il y a une erreur dedans :stuck_out_tongue:
Dans ton exemple ( encadré donc ) tu parles de cl_cours_categ mais on dirait plutot que c’est cl_cours, par rapport à ce que tu as noté juste au dessus.

Essaye de clarifier un peu les choses par contre :stuck_out_tongue:

Voilà mon idée :

SELECT * FROM cl_cours, cl_cours_categ WHERE cl_cours.id_parent = cl_cours_categ.id

et dans cette requete, on remplacerait cl_cours_categ.id par l’id extraite du parametre de l’Url. Aucune idée de la façon d’ecrire ça en PHP.

Mais je peux aussi me gourrer, je suis pas un SqlMasta !

Edit: petit precision suite au post d’Athena, parce moi pas tres clair ( décidement ! )

Je crois que la petite chose qui manque ici c’est la sélection de l’id à partir de l’url. Avec ton code monsieur max si je me trompe pas il va sortir tout les cours ainsi que leurs “enfants”, mais il faut qu’il choisisse un id et un seul, donc je crois qu’en rajoutant simplement :

ca devrait passer.

Maintenant jsuis surement encore moins un sql masta que monsieur max, et j’ai pas vraiment compris l’exemple non plus.

Je pense que ce qu’il veut faire, c’est récupérer tous l’arborescence. Avec son exemple :

C++
±— Objets
…±---- Heritage
…±---- Classes filles
…±---- Abstraction

Maintenant, en SQL c ptete faisable, en MySql je doute fortement.

My 2 cents.

J’avais fais un truc dans le genre, mais sous SqlServer. Bref ma technique était que l’id était un varchar contenant en fait la concaténation des id. par exemple, C++ aurait l’id 01, objets 0101, héritage 010101, classes filles 01010101 et abstraction 010102.

Du coup, si on veut une arbo sur 4 niveaux, on obtient ça:

[code]SELECT DISTINCT
1 as tag,
null as parent,

l.nom			  as [P!1!nom],
rtrim(l.id)			as [P!1!ID],

NULL			as [F!2!nom],
NULL			as [F!2!ID],

NULL			as [F!3!nom],
NULL			as [F!3!ID],

NULL			as [F!4!nom],
NULL			as [F!4!ID],

FROM cl_cours l (nolock)

WHERE len(rtrim(l.id_cours)) = 2

UNION ALL

SELECT DISTINCT
2 as tag,
1 as parent,

NULL,  
rtrim(Left(l.id_lien,2)),	

l.nom,
rtrim(l.id_lien),

NULL,
NULL,

NULL,
NULL,

FROM cl_cours l (nolock)

WHERE len (rtrim (l.id_cours)) = 4

UNION ALL

SELECT DISTINCT
3 as tag,
2 as parent,

NULL,
rtrim(Left(l.id_cours,2)),	

NULL,
rtrim(left (l.id_cours,4)),

l.nom,
rtrim(l.id_cours),

NULL,
NULL,	

FROM cl_cours l (nolock)

WHERE len (rtrim (l.id_cours)) = 6

UNION ALL

SELECT DISTINCT
4 as tag,
3 as parent,

NULL,  
rtrim(Left(l.id_cours,2)),	

NULL,
rtrim(left (l.id_cours,4)),

NULL,
rtrim(left (l.id_cours,6)),

l.nom,
rtrim(l.id_cours),	

FROM cl_cours l (nolock)
WHERE len (rtrim (l.id_lien)) = 8

ORDER BY [P!1!ID],[F!2!ID],[F!3!ID], [F!4!ID][/code]

Bon, c’est en fait la synthaxe pour un xml explicit dans SqlServer, et MySql ne doit pas trop connaître ce genre de truc: [P!1!nom], mais j’imagine que tu peux remplacer ça par des noms un peu moins barbabre et roulez jeunesse.

Pour sélectionner que ce qui t’intéresse, il te suffit de rajouter dans chaque close where un test sur l’id que tu passes en paramètre (sur le left de 2 de l’id pour être plus précis).

Le soucis est évidemment que tu as une limite de profondeur dans ton arborescence, et que le UNION n’est pas non plus l’opération la plus légère qui soit en SQL.

Voilà, en espérant que ça puisse tout de même t’aider un peu.

EDIT: ouaip, la solution de Glop est quand même bien meilleure :stuck_out_tongue:

Mais si :stuck_out_tongue:
Il y a un « truc », il faut pas stocker ses donnees comme ca c’est tout. C’est un probleme super classique en fait.

Il y a deux moyens sans les requetes recursives qui de toute facon sont pas tres jolies pour ca je trouve… La methode intuitive et « pas propre » (tout est relatif…) pour les petits arbres et les trucs fait rapide sans se prendre la tete: pour chaque objet dans ton arbre tu stockes genre un varchar avec le chemin complet jusqu’a l’objet et choper tous les enfants devient juste un select … like ‹ /1/3/6/7/5% › ou qqch du genre avec le debut du path.

La methode « bien » ou « nested sets » (pour chercher sur google ou autre utilise ce terme). Le monsieur la http://www.developersdex.com/gurus/articles/112.asp l’explique super mieux que moi qui permet de faire ce que tu veux de maniere « propre » au prix d’un peu de theorie des graphes/sets :stuck_out_tongue: Si ta table est deja stockee comme decrit plus haut c’est relativement facile a changer avec un algo « push down stack ».

Merci de vos réponses, jvais lire le lien de Glop.
SInon une idée m’est venue aujourd’hui :
si je stocke l’id de la CATEGORIE parente ( donc ici php ) pour chaque sous categorie :
dans l’url le premier element sera la catégorie, donc il y aura tous les enfants / sous enfants / sous sous sous sous sous enfants ( :stuck_out_tongue: )
ensuite il s’agira(it) de faire un select avec ça ET un autre truc qui me reste assez flou pour le moment un truc qui consisterai a virer de l’affichage tout ce qui n’a pas pour id_parent l’id du second paramettre, mais il en reste tout le temps …
re flou. j’ai meme envisagé une table temporaire et la remplir a partir d’un boucle, ce qui serait ptet moins lourd qu’une boucle php qui prenne tous les ids pour concatener un « AND id= »" ( c’etait ça ma soluce barbare )…
bon jvais lire et je réfléchis au varchar.

Edit : c’est quand même 'achement mieux la méthode du ptit monsieur.
jvais peut etre combler mes manques sur les arbres & co plus vite que je ne le pensais … ( ou du moins m’y initier )

En cherchant sur google n’empeche j’ai ete hallucine par le nombre de “pseudo conseils” en bois de gens qui pense re-inventer la roue en ayant trouve une methode boiteuse a base de varchar ou quoi, et qui presentent ca comme la methode. Ca fait relativiser pas mal ce qu’on peut trouver avec une recherche au pif sur le web, meme sur des sites de developpeurs…

Merci pour ma technique en bois :stuck_out_tongue:

Huhu non mais ca a rien a voir, j’ai pas dit ca pour toi du tout :stuck_out_tongue: t’ecris pas des articles sur des sites de developpeurs profesionnels sur ce sujet en decrivant ca comme la maniere de faire, et voila. J’imagine que si tu le faisais tu ferais quelques recherches sur le sujet ou t’ouvrirais un livre qui aborde ce probleme avant d’ecrire qqch et tu trouverais l’autre methode. C’est une chose de trouver soi meme une methode qui marche et tout et de la decrire a qqn comme ca, mais ca se sent bien que c’est bancal comme solution… utiliser une string et tout… Ca marche quoi… et d’ailleurs, l’autre methode, c’est vraiment pas le genre d’algo qu’on « trouve » comme ca et si on me l’avait pas appri c’est trop la solution que j’aurais utilise. Mais ca sent bien le hack faute de mieux quand meme. Du coup c’est un tout autre contexte d’ecrire serieusement un article en presentant ca comme la methode sans faire l’effort d’une recherche plus poussee. Dans un article, moi perso, ca me choque carrement :stuck_out_tongue: Mais je voulais froisser personne, j’avais pas assimile ca comme etant ta technique :P, je ralais contre ce qu’on trouve sur des sites de conseils aux dev apres une recherche sur google ou autre…

T’inquiètes pas, je l’avais pas pris pour moi, et je comprend tout à fait ce que tu voulais dire. C’était juste pour le plaisir de te voir partir dans un poste fleuve :stuck_out_tongue:

Tsss le fourbe :stuck_out_tongue:

J’ai quand meme un peu de voir comment implanter ça proprement avec du sql (faut que je relise la partie code) car bien que plus propre, ça rejoint ma methode qui consisterait a choper tous les fils a la suite ( genre fils de 1 et fils de 2 et fils de 3 etc … en suivant les id ) mais tout ça c’est plus du traitement de mysql non ?
( oula jsuis pas clair )
je recommence : la meilleure façon que je vois d’implementer ça c’est de faire un select des champs qui vont bien associées a la catégorie mere ( oui je vais peut etre l’ajouter finallement :stuck_out_tongue: ) pour ensuite via php par exemple parcourir les résultats de la requete …

si vraiment j’ai loupé un chapitre, faut pas crier hein :stuck_out_tongue: juste me le souligner.

Merci de vos réponses :stuck_out_tongue:

Non non tu chopes tout en une seule requete non recursive la. Relit :stuck_out_tongue:

Des fois que ça en interesse, une rapide recherche converge sur codeprojetct
et une ptit dernier pour Glop ( je sais que tu les aimes celles là ), avec des beaux schémas et tout ! Par ici
Merci a vous :stuck_out_tongue: