SELECT rapatriement multiple de données suivant liste id à virgule

alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009 - 16 sept. 2008 à 20:05
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 - 17 sept. 2008 à 19:29
Désolé pour ce titre foireux ... j'ai essayé de faire court pour un problème que j'ai du mal à exprimer simplement.

Je vais prendre un exemple fictif.

Mettons qu'on ait 2 tables. Une de recettes et une d'ingrédients.
Dans la table d'ingrédients, j'ai une colonne id_ingredient et une colonne nom_ingredient
Dans la table recettes, j'ai notamment une colonne ref_ingredients où je stocke les id des ingrédients utilisés. Genre ref_ingredients : 10,52,78,132.

Est-il possible directement dans une requête sur la table recettes de récupérer la liste des nomsref_ingrédients ??

Heu ... j'ai été claire là ? ...

6 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
16 sept. 2008 à 21:21
Salut

C'est que ta base est mal modélisée, il faut faire une table intermédiaire.

Avec un select in (1,2,3,..) peut etre que tu y arriveras.
0
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
16 sept. 2008 à 22:28
okok ... et à part ça, quelqu'un a une idée ?
0
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
17 sept. 2008 à 14:10
SELECT Nom_Ingredient FROM ingrédientswhere Id_Ingredient IN (10,52,78,132)

par exemple

ou

SELECT Nom_Ingredient FROM ingrédients where Id_Ingredient IN (SELECT ref_ingredient FROM recette WHERE Nom_recette='Tarte Citron')
0
alphanono Messages postés 39 Date d'inscription vendredi 9 mai 2003 Statut Membre Dernière intervention 25 mai 2009
17 sept. 2008 à 14:45
Merci ... mais je savais que ça ne serait pas très claire ... Le SELECT IN c'est ok. Mais c'est pas tout à fait ce que je cherche à faire. Je voudrais pouvoir éviter une requête PHP grâce à SQL si possible.

Je prend un exemple toujours :
TABLE RECETTES :
     nom_recetteref_ingredients
1              tarte          10,2,3

TABLE INGREDIENTS
id_ingredient  nom_ingredient
2              farine
3              sucre
10             fraise

J'aimerais pouvoir exécuter une requête qui me permettrait d'avoir en retour :

     nom_recetteref_ingredients  noms_ingredients
1              tarte          10,2,3           fraise,farine,sucre

C'est peut-être un peu tordu comme ça et c'est sûr que dans cet exemple de recettes, il vaudrait mieux passer par une table intérmédiaire enregistrant 1 id de recette pour 1 id d'ingrédient. Seulement dans mon cas concret ... c'est pas possible.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crn_c21 Messages postés 302 Date d'inscription samedi 24 janvier 2004 Statut Membre Dernière intervention 4 février 2011
17 sept. 2008 à 14:55
Je vois pa le truc possible en une seule requète, vaudrai mieux passer par une procédure stockée!!
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
17 sept. 2008 à 19:29
En sqlserver 2005,

On a (extrait de http://www.developpez.net/forums/d33411-2/bases-donnees/langage-sql/creation-faq-sql-voulez-participer/)

CREATETABLE Territoire (IdVendeur integer, Ville varchar(20))
 
INSERTINTO Territoire VALUES(1, 'Paris');
INSERTINTO Territoire VALUES(1, 'Lille');
INSERTINTO Territoire VALUES(1, 'Lyon');
INSERTINTO Territoire VALUES(1, 'Marseille');
INSERTINTO Territoire VALUES(1, 'Bordeaux');
INSERTINTO Territoire VALUES(2, 'Paris');
INSERTINTO Territoire VALUES(2, 'Lyon');
INSERTINTO Territoire VALUES(2, 'Brest');
INSERTINTO Territoire VALUES(3, 'Paris');
 
 
 
WITH px (idVendeur, Villes, Precedente, Niveau)AS
(SELECT IdVendeur, cast(Ville AS varchar(MAX)), cast (ville AS varchar(MAX)), 1
FROM Territoire a WHERE Ville (SELECT min(Ville)FROM Territoire b WHERE a.idVendeur b.idVendeur)
union ALL
SELECT a.IdVendeur, px.Villes + ';' + a.ville, cast(a.Ville AS varchar(max)), Niveau + 1
FROM Territoire a INNERJOIN px ON a.idVendeur = px.idVendeur AND a.Ville > px.Precedente
)
SELECT IdVendeur, Villes
FROM px a WHERE Niveau (SELECT max(Niveau)FROM px b WHERE a.idVendeur b.idVendeur)

C'est ce qui s'appele une CTE common table expression
requete recursive
avec une procedure stockée ou par du code.
il est possible de faire le meme résultat

Je mets l'exemple au cas où un autre membre cherche la même chose mais sur SQL SERVEUR

Bon coding
0