Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1578 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Alternative a la boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Alternative a la boucle

n°2337310
vylkor
Posté le 26-07-2019 à 22:38:08  profilanswer
 

Bonjour a tous,
 
Je suis assez débutant en SQL, et je dois faire une requête vers une base assez... Hardcore. L'informaticien qui la gère est débordé, il a pas le temps de la faire donc j'aimerais lui proposer une solution clé en main.
 
La problématique: on a un produit avec un ou plusieurs commentaires. Je veux récupérer tous ces commentaires
 
Dans la structure, j'ai une table "Produit" et une table "Commentaire". Un produit peut avoir plusieurs commentaires, un commentaire est sur un seul produit. Sauf que les commentaires sont reliés de la manière suivante:
Table Produit
product_num | Comment_ID | etc...
Table Commentaire
Comment_ID | NextComment_ID | etc...
 
Donc si je veux trouver tous les commentaires d'un produit, je dois faire la jointure entre la table Produit et commentaire, et pour les suivants je dois regarder si N° CommentaireSuivant est pas nul...
 
Je sais pas si j'ai été clair, voici la requête crée pour l'instant:
 

Code :
  1. Declare @NoProduit Varchar(10)
  2.        Set @NoProduit = '0123456789'
  3. Declare @CommentID INT;
  4.        Set @CommentID = Null
  5. Declare @Results table(
  6.        NoProduit_Result Varchar(10),
  7.        Comments_Result Varchar(150),
  8.        Date_Result DateTime
  9. )
  10. Set @CommentID = (Select top 1 PR.Comment_ID from Produit PR with (nolock) where product_num = @NoProduit)
  11. While ((select Top 1 CO.NextComment_Id from Comments CO with (nolock) where CO.Comment_Id = @CommentID) IS NOT NULL)
  12. Begin
  13.        INSERT Into @Results
  14.              Select Top 1 @NoProduit, CO.Comment_Text, CO.Modified_On From Comments CO with (nolock) where CO.Comment_ID = @CommentID
  15.        Set @CommentID = (Select top 1 CO.NextComment_Id from Comments CO with (nolock) where CO.Comment_Id = @CommentID)
  16. END
  17. INSERT Into @Results (NoProduit_Result, Comments_Result, Date_Result )
  18.        Select Top 1 @NoProduit, CO.Comment_Text, CO.Modified_On From Comments CO with (nolock) where CO.Comment_ID = @CommentID
  19. Select * From @Results


 
Le problème, c'est que je sais que cette requête sera refusée car la boucle est quelque chose de trop dangereux si j'ai bien compris... Je suis preneur de toute alternative qui permettrait de se passer de la boucle et permette de récupèrer tous les résultats, merci d'avance :)
 
PS: j'ai testé la solution des jointure de la table comment sur elle même, mais ça permet de récupérer autant de résultat qu'on répète la ligne dans le code, ça me parais pas très propre:

Code :
  1. Left Join Comments as CO on  CO.Comment_Id = E.Comment_Id
  2. Left Join Comments as CO2 on CO.NextComment_ID = CO2.Comment_ID
  3. Left Join Comments as CO3 on CO2.NextComment_ID = CO3.Comment_ID


Message édité par vylkor le 26-07-2019 à 22:45:35
mood
Publicité
Posté le 26-07-2019 à 22:38:08  profilanswer
 

n°2337311
TotalRecal​l
Posté le 27-07-2019 à 09:49:45  profilanswer
 

Ce que tu vas pouvoir utiliser dépend fortement du SGBDR, donc tu dois préciser lequel tu emploie s.
Par exemple ous SQL Server ça peut se faire avec une CTE (premier lien en français : https://www.softfluent.fr/blog/expe [...] SQL-Server ).


Message édité par TotalRecall le 27-07-2019 à 09:51:48

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2337346
rufo
Pas me confondre avec Lycos!
Posté le 27-07-2019 à 18:45:40  profilanswer
 

La structure de la table commentaires me paraît vraiment naze et pas pratique du tout à requêter :/
En toute logique, c'est le ProduitID qui devrait être clé étrangère dans la table commentaire et pas le contraire puisqu'on est dans une relation 1-n : 1 produit à 0 à plusieurs commentaires. Ca sent la BD mal conçue :o


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2337386
flo850
moi je
Posté le 29-07-2019 à 10:36:41  profilanswer
 

c'est du sql server, je crois

 

Essaye avec ce genre d'approche : https://stackoverflow.com/questions [...] -any-child , ce sera toujours plus perf que de boucler depuis l'exterieur du SGBD

 

ce serait plus simple avec une autre structure, genre ajouter une colonne product_id_root, mets à jour les données existantes, et ajoute une trigger qui, lors de l'ajout d'une ligne met à jour cette donnée


Message édité par flo850 le 29-07-2019 à 10:37:52

---------------


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Alternative a la boucle

 

Sujets relatifs
Condition jQuery dans boucle Wordpressalternative à document.write()
Soustraction recherchev en boucleBoucle foreach
Erreur en fin de boucle ?Passer au tour suivant boucle for each et probleme if
Boucle en SQLprobleme de boucle
Boucle FOR : ") etait inattendu" 
Plus de sujets relatifs à : Alternative a la boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR