IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête SQL complexe sur trois tables


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 2
    Points
    2
    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 :

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    commence d'abord pas une conception claire de tes tables :
    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    - Magasins [id, nom]
    - Clients [id, magasin_id]
    - Achats [id, client_id, date_validation, validation]
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dernière modification par Invité ; 03/08/2011 à 13h19.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    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

  4. #4
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    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 :

    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é ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    en faisant 2 requêtes ... ou en utilisant des sous-requêtes ...

    (Sans AUCUNE certitude !) ca pourrait ressembler à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Dernière modification par Invité ; 03/08/2011 à 16h10.

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour le coup de main.

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

    Merci

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/07/2012, 14h52
  2. Requête SQL simple sur deux tables
    Par Contrec dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/02/2012, 17h26
  3. [Hibernate 2]Requête SQL native sur plusieurs tables
    Par Giovanny Temgoua dans le forum Hibernate
    Réponses: 0
    Dernier message: 06/04/2010, 16h10
  4. Requete SQL complexe sur plusieurs tables
    Par vnk600 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 13/12/2009, 11h22
  5. Requête SQL : Jointure sur 3 tables - Bd Access 1997 & Delphi 7
    Par Didier100 dans le forum Bases de données
    Réponses: 2
    Dernier message: 28/12/2007, 09h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo