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

Langage SQL Discussion :

Problème de jointure


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème de jointure
    Bonjour à tous,
    Je viens vers vous pour vous demander de l'aide, car cela fais deux jours que je bloque

    Le projet sur lequel je travail est un site de jeux en ligne.
    J'ai trois tables:
    Users:
    users_id

    Users_point
    users_id
    camp_nom
    type (mail, jeux,...)
    created_at

    Users_argent
    users_id
    cash
    type (mail, jeux,...)
    created_at

    J'aimerai récupérer toutes ses données, ordonnées par date.
    Voici ma requête actuelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.`users_id`, p.`camp_nom`, p.`camp_point` AS points, DATE(p.`created_at`) AS date_points, c.`type`, c.`cash`, DATE(c.`created_at`) AS date_cash
    FROM users u 
    LEFT JOIN users_points p ON u.`users_id`=p.`users_id`
    LEFT JOIN users_cash c ON u.`users_id`=c.`users_id`
    WHERE u.`users_id`=1
    GROUP BY 1, 4, 7;
    Malheureusement, les dates ne sont pas alignées et au lieu de me mêttre des champs NULL là ou les dates ne sont pas les même, il me créer des doublons:


    Auriez-vous une solution à me proposer ? J'aimerai ne pas avoir à séparer les deux requêtes car ça me compliquerai l'affichage.
    Merci par avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,
    Je ne suis pas sûr d'avoir bien compris ce qu'il vous faut. N'est-ce pas une requete UNION ?

    sinon postez un jeu d'essai et le résultat attendu, ce sera plus explicite...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Qu'est-ce donc ?

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Qu'est-ce donc ?
    un groupement sur la première, quatrième et septième colonne, mais effectivement :

    1/ ce n'est pas très explicite
    2/ certaines colonnes ne sont ni dans le group by, ni dans des fonctions d'agregat...

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Désolé, j'avoue ne pas avoir été bien claire sur le résultat attendu du fait que j'ai été pressé hier.

    En fait je voudrai afficher donc les données de ces tables, ordonnées par date (date des points et date du cash).
    Si pour une date(point) il n'y a pas de date(cash), les colonnes pour le cash doivent être à NULL, et les afficher plus bas si date(cash) > date(point).

    J'ai pensé à un UNION mais j'obtiens le même résultat (p.users_point_id étant la clé primaire de la taple points).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    (SELECT DATE(p.created_at) AS DATE,p.users_id,p.camp_nom,p.camp_point,c.cash,c.type
    FROM users_points p LEFT JOIN users_cash c ON p.users_id=c.users_id
    GROUP BY DATE,c.users_cash_id,p.users_points_id)
    UNION ALL
    (SELECT DATE(p.created_at) AS DATE,p.users_id,p.camp_nom,p.camp_point,c.cash,c.type
    FROM users_cash c RIGHT JOIN users_points p ON c.users_id=p.users_id
    GROUP BY DATE,c.users_cash_id,p.users_points_id)
    LIMIT 100;

    En tout cas voici le résultat des deux tables séparées:
    POINTS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT u.`users_id`, p.`camp_nom`, p.`camp_point` AS points, DATE(p.`created_at`) AS date_points
    FROM users u 
    LEFT JOIN users_points p ON u.`users_id`=p.`users_id`
    WHERE u.`users_id`=1
    GROUP BY date_points;


    CASH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT u.`users_id`, c.`type`, c.`cash`, DATE(c.`created_at`) AS date_cash
    FROM users u 
    LEFT JOIN users_cash c ON u.`users_id`=c.`users_id`
    WHERE u.`users_id`=1
    GROUP BY date_cash;


    Comme vous le voyez il n'y a que deux lignes pour le cash. Donc je ne devrai mm pas avoir autant de ligne comme sur le premier screenshot.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    C'est un peu n'importe quoi au niveau des "GROUP BY".
    Tu devrais commencer par activer cette option :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET SQL_MODE=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Solution trouvée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    (SELECT 
    DATE(created_at) AS created,
    users_id,
    camp_nom,
    camp_point,
    NULL AS cash,
    NULL AS TYPE
    FROM users_points 
    GROUP BY created
    LIMIT 100)
     
    UNION ALL
     
    (SELECT 
    DATE(created_at) AS created,
    users_id,
    NULL AS camp_nom,
    NULL AS camp_point,
    users_cash.cash,
    users_cash.type
    FROM users_cash
    GROUP BY created
    LIMIT 100)
    ORDER BY created;


    Merci à vous tous.

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Tes "GROUP BY" sont soient faux soient inutiles.

    Je pense qu'il faudrait faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    (
    	SELECT 
    		DATE(created_at) AS created,
    		users_id,
    		camp_nom,
    		camp_point,
    		NULL AS cash,
    		NULL AS TYPE
    		FROM users_points 
    		ORDER BY created LIMIT 100
    )
    UNION ALL
    (
    	SELECT 
    		DATE(created_at),
    		users_id,
    		NULL,
    		NULL,
    		users_cash.cash,
    		users_cash.type
    		FROM users_cash
    		ORDER BY created LIMIT 100
    )
    ORDER BY created LIMIT 100;

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

Discussions similaires

  1. Problème de jointure de tables
    Par AurelBUD dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2005, 16h27
  2. Probléme de jointure
    Par Ajrarn dans le forum Langage SQL
    Réponses: 14
    Dernier message: 24/02/2005, 14h57
  3. Vraisemblable problème de jointure
    Par pimousse76 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2005, 15h34
  4. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 21h15
  5. Problème de jointure ?!
    Par ebaynaud dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/11/2004, 11h27

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