Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 03/08/2011, 12h35   #1
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 6
Points : 0
Points : 0
Par défaut Requête SQL complexe sur trois tables

Bonjour,

Je souhaiterai faire une requête sur trois table, mais c'est assez complexe pour moi. Est-ce que vous pouvez me donner un coup de main ? Merci!

J'ai trois tables :
- Magasins [id, nom]
- Clients [id, magasin_id]
- Achats [id, client_id, date_validation, validation]


On peut voir dans la table Achats qu'il y a des champs de validation. C'est tout simplement parce qu'une personne a validé (=1) ou ou non (=0) l'achat.

Le principe est simple.

Je voudrais lister pour chaque magasin :
- le nom du magasin
- la date du dernier achat validé.
- le nombre d'achat non validé.

Ça ressemblerai à ceci :

Citation:
Auchan, 2010-01-01, 225
Carefour, 2010-05-12, 157
Leclerc, 2011-10-10, 25
...

Voici ma requête actuelle... (attention ca pique!)
Mais il manque la selection de la date du dernier achat validé.

Code :
1
2
3
4
SELECT M.nom, COUNT(A.id) as nombreAchats
FROM achats as A
LEFT OUTER JOIN clients as C ON C.id =R.client_id
LEFT OUTER JOIN magasins as M ON M.id = C.magasin_id GROUP BY M.id
Merci!
NET_Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 13h08   #2
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Bonjour,
commence d'abord pas une conception claire de tes tables :
Remplacer :
Code :
1
2
3
- Magasins [id, nom]
- Clients [id, magasin_id]
- Achats [id, client_id, date_validation, validation]
par :
Code :
1
2
3
- Magasins [id_magasin, nom]
- Clients [id_client, id_magasin]
- Achats [id_achat, id_client, date_validation, validation]
Comme ca, les relations entre tables sont facilement lisibles et ne risquent pas de porter à confusion (actuellement, "id" est source de confusion !)

Et on obtient :
Code :
1
2
3
4
SELECT M.nom, COUNT(A.id_achat) as nombreAchats
FROM achats as A
	JOIN clients as C ON C.id_client = R.id_client
	JOIN magasins as M ON M.id_magasin = C.id_magasin GROUP BY M.id_magasin
INNER JOIN, OUTER JOIN ? voir Syntaxe normalisée des jointures
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 15h01   #3
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 6
Points : 0
Points : 0
Bonjour jreaux62!

Merci pour tes conseils, je vais les prendre en compte.

Pour ta solution, on n'a pas la date du dernier achat validé pour le magasin.

Tu aurais une solution ?

Merci encore
NET_Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 15h20   #4
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Code :
1
2
3
4
SELECT M.nom, COUNT(A.id_achat) as nombreAchats, A.date_validation
FROM achats as A
	LEFT OUTER JOIN clients as C ON C.id_client = R.id_client
	LEFT OUTER JOIN magasins as M ON M.id_magasin = C.id_magasin GROUP BY M.id_magasin
(?) Tu peux récupérer ce que tu veux avec le SELECT ...
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 15h36   #5
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 6
Points : 0
Points : 0
Je voudrais lister pour chaque magasin :
- le nom du magasin
- la date du dernier achat validé.
- le nombre d'achat non validé.

Avec la requête, si je fait ceci :

Citation:
SELECT M.nom, COUNT(A.id_achat) as nombreAchats, MAX(A.date_validation) as date
FROM achats as A
LEFT OUTER JOIN clients as C ON C.id_client = R.id_client
LEFT OUTER JOIN magasins as M ON M.id_magasin = C.id_magasin
WHERE validation = 0 GROUP BY M.id_magasin
Ma dernière date de validation MAX(A.date_validation) vaut '0000-00-00', ce qui est normal puisque ma sélection porte sur les achats non validé (WHERE A.validation = 0).

Mais alors comment faire pour obtenir la date du dernier achat validé tout en comptant le nombre d'achat non validé ?
NET_Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 15h49   #6
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
en faisant 2 requêtes ... ou en utilisant des sous-requêtes ...

(Sans AUCUNE certitude !) ca pourrait ressembler à ca :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT 
	M.nom, 
	(SELECT COUNT(A.id_achat) FROM achats WHERE validation = 0) AS nombreAchats, 
	(SELECT MAX(A.date_validation) FROM achats WHERE validation = 1) AS date
FROM achats AS A
	LEFT OUTER JOIN clients AS C 
		ON C.id_client = R.id_client
	LEFT OUTER JOIN magasins AS M 
		ON M.id_magasin = C.id_magasin
GROUP BY M.id_magasin
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/08/2011, 18h24   #7
Invité de passage
 
Homme
Inscription : mai 2011
Messages : 6
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 6
Points : 0
Points : 0
Merci pour le coup de main.

Pour ta requête, j'ai une erreur :
Code :
#1242 - Subquery returns more than 1 row
Je pensais qu'il y avait possibilité de tout faire en une requête... temps pie!

Merci
NET_Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h26.


 
 
 
 
Partenaires

Hébergement Web