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 sur 3 tables avec contraintes [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Par défaut Requête sur 3 tables avec contraintes
    Bonjour, je lis beaucoup sur ce forum et c'est mon premier post.
    Pour exposer mon problème, j'ai 3 tables :

    users
    user_id, nom, prenom

    years
    year_id, user_id, abonnement

    payments
    payment_id, year_id, user_id, value


    Je souhaite faire un SELECT qui me permettra d'afficher TOUS les user_id présents dans la table "years" avec la somme du champ "value" (table "payments") ainsi que leur nom et prénom (table "users").

    Est-ce possible ? C'est probable.... mais comment !?
    N'étant pas un crac en SQL et après de nombreux essais qui ne donnent rien, il faut me résoudre à l'évidence : j'ai besoin d'aide...

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, prenom, SUM(value)
    FROM users
    JOIN years ON users.user_id = years.user_id
    JOIN payments ON years.year_id = payments.year_id
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Par défaut
    Bonjour et merci beaucoup pour votre réponse.
    La requête que vous proposez fonctionne. Elle fonctionne même très bien, mais je n'obtiens pas le résultat voulu, car je me suis mal exprimé.

    Voici un exemple des données dans mes tables :
    users (user_id [primaire], nom, prenom)
    1, CHRISTOPHE, Denis
    2, DAVID, Alain
    3, BERTRAND, Damien
    4, BERNARD, Henri
    5, VINCENT, Stéphane

    years (year_id, user_id, abonnement)
    2013, 2, 'Activité 1 + Activité 5'
    2013, 3, 'Activité 3'
    2013, 4, 'Activité 1 + Activité 3'

    payments (payment_id [primaire], year_id, user_id, value)
    1, 2012, 2, 100
    2, 2013, 2, 20
    3, 2013, 2, 20
    4, 2013, 3, 50

    Je souhaite pouvoir sélectionner year_id=2013 et que la requête mysql me retourne les résultats suivants :

    DAVID, Alain, 40
    BERTRAND, Damien, 50
    BERNARD, Henri, 0

    En clair, je souhaite tous les enregistrements présents dans la table "years" avec year_id=2013 et la somme "value" dans la table "payments" regroupée par user_id pour year_id=2013 (avec la somme=0 si le user_id n'est pas présent dans la table "payments").

    Il me semble que j'ai déjà vu ce genre de requête, mais c'est vraiment au-delà de mes modestes capacités en SQL. Encore merci pour votre réponse.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT users.user_id, nom, prenom, SUM(IFNULL(value,0)) as somme
    FROM users
    LEFT JOIN years ON users.user_id = years.user_id
    JOIN payments ON years.year_id = payments.year_id
    GROUP BY users.user_id, nom, prenom
    AND WHERE years.year_id='2013';

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Par défaut
    Merci pour votre réponse Armel.
    En exécutant votre requête, j'obtiens l'erreur suivante :

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE years.year_id='2013' LIMIT 0, 30' at line 6


    A force de bricolage et en m'inspirant de votre solution, j'ai tout de même trouvé à faire fonctionner selon mes besoins :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT nom, prenom, 
    IFNULL((SELECT SUM(IFNULL(value,0)) FROM payments WHERE payments.year_id='2013' AND users.user_id=payments.user_id),0) AS total
    FROM users
    RIGHT JOIN years ON users.user_id = years.user_id
    WHERE years.year_id='2013'

    Mes connaissances étant un peu "limites", je suppose que la solution que j'ai trouvé est beaucoup plus "gourmande" en ressources que celle que vous proposez.

    Je marque comme résolu. Toutefois je suis bien curieux de savoir s'il existe une solution plus optimale.
    Encore merci pour votre aide.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Par défaut
    c'est ma clause AND qui provoque l'erreur de syntaxe.je l'ai enlevé:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT users.user_id, nom, prenom, SUM(IFNULL(value,0)) AS somme
    FROM users
    LEFT JOIN years ON users.user_id = years.user_id
    JOIN payments ON years.year_id = payments.year_id
    WHERE years.year_id='2013'
    GROUP BY users.user_id, nom, prenom

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Mars 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Mars 2013
    Messages : 4
    Par défaut
    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/04/2009, 11h31
  2. Requête sur 2 tables avec critères de jointures particuliers
    Par Randomdev dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/01/2009, 18h00
  3. Requête sur plusieurs tables avec DLookup ?
    Par Falcdyr dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 07/05/2008, 08h50
  4. Réponses: 4
    Dernier message: 05/03/2008, 09h32
  5. problème sur requête sur 3 tables avec une somme
    Par tomguiss dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/12/2007, 16h44

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