Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 03/01/2013, 18h33   #1
fraginfo
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 66
Points : 10
Points : 10
Par défaut Select à partir de 2 tables

Bonjour,

soit 3 tables :

Table Produit(id, id_categorie)

Table Categorie(id)

Table Categorie_Produit(id_produit, id_categorie)


A la base du projet, un produit ne pouvait être que dans une seule catégorie, donc l'id de la catagorie était stocké dans la table Produit.

Le projet a évolué et maintenant un produit peut être dans plusieurs catégories, mais la catégorie principale est toujours stockée dans la table produit.

Le but est donc de faire une requête qui me sorte tous les produits pour un id de catégorie donné. Il faut que la requête me sorte les produits dont la catégorie principale est stockée dans Produit, mais aussi ceux qui sont dans Categorie_Produit !

Je ne vois pas comment faire ça en une seule requête, est ce possible ????

Merci de votre précieuse aide !

++
fraginfo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 10h09   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
Ben il suffit de deux clauses de restriction dans le WHERE séparées par un OR :
Code :
1
2
WHERE Produit.id_categorie = $categorie_choisie
	OR Categorie_Produit.id_categorie = $categorie_choisie
Bien entendu, l'utilisation d'alias pour les tables rendra la requête plus facile à écrire et à lire.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h06   #3
fraginfo
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 66
Points : 10
Points : 10
Merci.

J'ai fais cette reqûete un peu tordue, mais elle ne fonctionne que dans le cas où une catégorie a un produit dans la table categorie_produit, si ce n'est pas le cas, la requete ne me retourne pas les produits d'une catégorie juste avec l'id_categorie de la table produit ...

Code :
1
2
3
SELECT produit.* , marque.nom AS nomMarque 
FROM produit, marque, categorie_produit 
WHERE (produit.id_categorie=$cat OR (categorie_produit.id_categorie=$cat AND categorie_produit.id_produit=produit.id))  AND marque.id=produit.id_marque AND produit.statut=1
fraginfo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 21h57   #4
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 659
Points : 25 562
Points : 25 562
Envoyer un message via MSN à CinePhil
1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !

2) Évitez de relancer la guerre des étoiles !

3) L'utilisation d'alias rend la requête plus facile à lire et à débuguer. Il est fortement recommandé de les utiliser systématiquement dès qu'une requête emploie plus d'une table.

4) Une requête correctement indentée et aérée est plus facile à lire, à comprendre, à débugguer.

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT p.id, -- autres colonnes éventuelles de la table produit mais en les nommant, pas étoile !
	m.nom AS nom_marque
FROM produit p
INNER JOIN marque m ON m.id = p.id_marque
LEFT OUTER JOIN categorie_produit cp ON cp.id_produit = p.id
WHERE p.statut = 1
	AND 
	(
		p.id_categorie = $cat
		OR cp.id_categorie = $cat
	)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 12h37   #5
fraginfo
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 66
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 66
Points : 10
Points : 10
merci beaucoup !
fraginfo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h36.


 
 
 
 
Partenaires

Hébergement Web