Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2011, 20h20   #1
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Par défaut Récuperer une liste de recettes !

Bonjour à tous

Je cherche à me remettre au SQL, et j'ai déjà quelques soucis.
Je possède une unique table (pour simplifier), contenant 2 colonnes : une liste d'identifiants de recettes, et une liste d'identifiants d'ingrédients. Cette base représente la liste des ingrédients nécessaires pour l'exécution d'une recette.

Je cherche à trouver les recettes comprenant UNIQUEMENT une liste d'ingrédients.
Mes petites pistes sont :
- Obtenir la liste des recettes contenant au moins un ingrédient :
Code :
1
2
3
4
SELECT recette
FROM rec_ingr
WHERE (ingr = 1) OR (ingr = 2) OR (ingr = 3)
GROUP BY recette
- Obtenir la liste des recettes possédants 3 ingrédients :
Code :
1
2
3
4
SELECT recette, COUNT(ingr)
FROM rec_ingr
GROUP BY recette
HAVING COUNT(ingr) = 3
- Obtenir la liste des recettes possédant au moins ces 3 ingrédients :
Code :
1
2
3
4
5
SELECT recette
FROM rec_ingr
WHERE (ingr = 1) OR (ingr = 2) OR (ingr = 3)
GROUP BY recette
HAVING COUNT(ingr) = 3
... Je me doute bien qu'il doit y avoir une jointure à faire, mais je ne trouve pas comment faire !

Merci de m'éclairer...

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 21h40   #2
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Citation:
Envoyé par ForgetTheNorm Voir le message
- Obtenir la liste des recettes contenant au moins un ingrédient :
Code :
1
2
3
4
SELECT recette
FROM rec_ingr
WHERE (ingr = 1) OR (ingr = 2) OR (ingr = 3)
GROUP BY recette
Code :
1
2
3
4
 
SELECT recette, COUNT(ingr) FROM rec_ingr
GROUP BY recette
HAVING COUNT(ingr) >= 1
Citation:
Envoyé par ForgetTheNorm Voir le message
- Obtenir la liste des recettes possédants 3 ingrédients :
Code :
1
2
3
4
SELECT recette, COUNT(ingr)
FROM rec_ingr
GROUP BY recette
HAVING COUNT(ingr) = 3
Code :
1
2
3
4
 
SELECT recette, COUNT(ingr) FROM rec_ingr
GROUP BY recette
HAVING COUNT(ingr) = 3
Citation:
Envoyé par ForgetTheNorm Voir le message
- Obtenir la liste des recettes possédant au moins ces 3 ingrédients :
Code :
1
2
3
4
5
SELECT recette
FROM rec_ingr
WHERE (ingr = 1) OR (ingr = 2) OR (ingr = 3)
GROUP BY recette
HAVING COUNT(ingr) = 3
Code :
1
2
3
4
5
 
SELECT recette, COUNT(DISTINCT ingr) FROM rec_ingr
WHERE ingr IN (1,2,3)
GROUP BY recette
HAVING COUNT(ingr) >= 3
Citation:
Envoyé par ForgetTheNorm Voir le message
... Je me doute bien qu'il doit y avoir une jointure à faire, mais je ne trouve pas comment faire !
Moi je ne vois pas de jointures
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 00h56   #3
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Bonjour.

Merci pour les quelques modifications. Ce n'est pas vraiment ce que je voulais, mais ça m'a au moins permis de me rappeler le IN.

Citation:
Envoyé par okoweb Voir le message
Moi je ne vois pas de jointures
Normal ! Les précédentes requêtes fonctionnent, mais je n'arrive pas à en faire une plus compliquée...
Citation:
Envoyé par ForgetTheNorm Voir le message
Je cherche à trouver les recettes comprenant UNIQUEMENT une liste d'ingrédients.
Quelqu'un a-t-il une idée ?

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 10h28   #4
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Bonjour

Les réponses se faisant rares, je vais tenter d'expliquer d'une autre manière.
Voici une table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
recette | ingredient
1       | 1
1       | 2
1       | 2
2       | 1
2       | 2
3       | 2
3       | 2
3       | 3
4       | 1
4       | 2
4       | 2
4       | 3
Je veux récupérer l'ensemble des recettes possédant uniquement les ingrédients (1,2,2). La requête doit être capable de ne pas prendre en compte :
- les recettes où il manque au moins 1 ingrédient (recette 2, 3)
- les recettes où il y a tous les ingrédients mais d'autres en plus (recette 4)
En d'autres termes, la requête doit retourner la recette 1.

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 11h38   #5
Membre confirmé
 
Avatar de GyZmoO
 
Homme Mickaël
Ingénieur développement logiciels
Inscription : février 2006
Messages : 402
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : février 2006
Messages : 402
Points : 238
Points : 238
Envoyer un message via MSN à GyZmoO
Bonjour.

Si vous avez la possibilité de modifier la structure du schéma, :
Faire une table RECETTE, une table INGREDIENTS avec une table d'association au milieu RECETTE<->INGREDIENTS avec dans cette table d'association la quantité nécessaire d'un ingrédient particulier pour une recette particulière.

Cela pourrait simplifier les choses.
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.
GyZmoO est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/01/2011, 10h44   #6
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Citation:
Envoyé par GyZmoO Voir le message
Bonjour.

Si vous avez la possibilité de modifier la structure du schéma, :
Faire une table RECETTE, une table INGREDIENTS avec une table d'association au milieu RECETTE<->INGREDIENTS avec dans cette table d'association la quantité nécessaire d'un ingrédient particulier pour une recette particulière.

Cela pourrait simplifier les choses.

Bonjour

J'ai réussi avec ta méthode. Je suis parti d'une table
(recette, ingr, c_ingr) qui donne le "nombre" d'ingrédient (que tu appelles "quantité" dans ton précédent post) au lieu de tous les lister.

Ensuite, avec la requete :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT recette
FROM rec_ingr
WHERE recette IN
(
  SELECT recette
  FROM rec_ingr
  WHERE (ingr = 1 AND c_ingr = 1)
    AND (ingr = 2 AND c_ingr = 2)
  GROUP BY recette
  HAVING SUM(recette) = 3
)
GROUP BY recette
HAVING SUM(recette) = 3
Ce n'est pas très beau, mais ça a le mérite de fonctionner.

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h43.


 
 
 
 
Partenaires

Hébergement Web