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

JDBC Java Discussion :

Double jointure gauche retourne mauvais résultats


Sujet :

JDBC Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Double jointure gauche retourne mauvais résultats
    Bonjour,

    Débutant en Java en train de développer une petite appli je me trouve confronté au problème suivant et j'espère pouvoir bénéficier de vos lumières...

    C'est un petit programme de paris sportifs ...

    BD MySQL, 2 tables :
    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
     
    mysql> desc tmpari;
    +---------------+------------+------+-----+---------+
    | Field               | Type         | Null    | Key | Default   |
    +---------------+------------+------+-----+---------+
    | id_pari            | int(11)       | NO    | PRI  |              |
     
    | id_equipe1       | int(11)       | YES  |        | NULL      |
    | id_equipe2       | int(11)       | YES  |        | NULL      |
    | score_gagnant | int(11)       | YES  |        | NULL      |
    | score_perdant  | int(11)       | YES  |        | NULL      |
    | resultat_pari     | tinyint(1)   | YES  |        | NULL      |
    +---------------+------------+------+-----+---------+
    6 rows in set (0.00 sec)
     
    mysql> desc tmequipe;
    +---------------+--------------+------+-----+---------+
    | Field               | Type            | Null    | Key | Default   |
    +---------------+--------------+------+-----+---------+
    | id_equipe         | int(11)          | NO   | PRI   |            |
    | nom_equipe      | varchar(50)   | YES  |        | NULL     |
    | classement       | int(11)         | YES   |       | NULL      |
    +---------------+--------------+------+-----+---------+
    3 rows in set (0.00 sec)
    Je souhaite donc récupérer pour chaque pari le nom des équipes. Pour cela j'utilise la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    mysql> select tmpari.id_pari, tmpari.id_equipe1, equipe1.nom_equipe, tmpari.id_equipe2, equipe2.nom_equipe from tmpari
        -> left join TMequipe as Equipe1 on Equipe1.id_equipe = TMPari.id_equipe1
        -> left join TMEquipe as Equipe2 on Equipe2.id_equipe = TMPari.id_equipe2;
    +---------+------------+------------+------------+------------+
    | id_pari    | id_equipe1  | nom_equipe | id_equipe2 | nom_equipe |
    +---------+------------+------------+------------+------------+
    |       1     |          1     | Marseille     |          2      | PSG           |
    |       2     |          1     | Marseille     |          2      | PSG           |
    |       3     |          1     | Marseille     |          3      | Lyon          |
    |       4     |          2     | PSG           |          3      | Lyon          |
    +---------+------------+------------+------------+------------+
    4 rows in set (0.01 sec)
    Là ça fonctionne correctement ...

    Maintenant la même chose en Java :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    import java.io.*;
    import java.sql.*;
     
    public class Nouveau2 {
    	public static void main(String[] args) {
    		try {
    			AccesDB accesDB = new AccesDB("jdbc:mysql://localhost:3306/TMParis", "root", "");
    			String requete = "select tmpari.id_pari, tmpari.id_equipe1, equipe1.nom_equipe, tmpari.id_equipe2, equipe2.nom_equipe from tmpari ";
    			requete += "left join TMequipe as Equipe1 on Equipe1.id_equipe = TMPari.id_equipe1 ";
    			requete += "left join TMEquipe as Equipe2 on Equipe2.id_equipe = TMPari.id_equipe2;";
     
    			System.out.println(requete);
     
    			ResultSet rs = accesDB.getAccesStatement().executeQuery(requete);
     
    			if (rs.next()) {
    				ResultSetMetaData meta = rs.getMetaData();
    				int nbColonnes =  meta.getColumnCount();
    				int cpt = 0;
    				while (rs.next()) {
    					cpt++;
    					System.out.println("Pari : " + cpt);
    					for (int j = 1; j <= nbColonnes; j++) {
    						if ( meta.getColumnTypeName(j) == "INT" ) {
    							System.out.print(meta.getColumnLabel(j) + " ==> " + rs.getInt(meta.getColumnLabel(j)) + "  -  ");
    						} else if ( meta.getColumnTypeName(j) == "VARCHAR" ) {
    							System.out.print(meta.getColumnLabel(j) + " ==> " + rs.getString(meta.getColumnLabel(j)) + "  -  ");
    						}
    					}
    					System.out.println("");
    				}
    			}
    			accesDB.closeAccesDB();
    		} catch ( SQLException e ) {
    			e.printStackTrace();
    		}
    	}
    }
    Et j'obtiens le résultat suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    c:\Java>javac Nouveau2.java
     
    c:\Java>java Nouveau2
    select tmpari.id_pari, tmpari.id_equipe1, equipe1.nom_equipe, tmpari.id_equipe2, equipe2.nom_equipe from tmpari left join TMequipe as Equipe1 on Equipe1.id_equipe = TMPari.id_equipe1 left join TMEquipe as Equipe2 on Equipe2.id_equipe = TMPari.id_equipe2;
     
    Pari : 1
    id_pari ==> 2  -  id_equipe1 ==> 1  -  nom_equipe ==> Marseille  -  id_equipe2 ==> 2  -  nom_equipe ==> Marseille  -
    Pari : 2
    id_pari ==> 3  -  id_equipe1 ==> 1  -  nom_equipe ==> Marseille  -  id_equipe2 ==> 3  -  nom_equipe ==> Marseille  -
    Pari : 3
    id_pari ==> 4  -  id_equipe1 ==> 2  -  nom_equipe ==> PSG  -  id_equipe2 ==> 3  -  nom_equipe ==> PSG  -
     
    c:\Java>
    La requête renvoie toujours les premiers enregistrements récupérés dans la table TMEquipe.

    Auriez-vous éventuellement une idée ? Un début de piste ? ...
    Sur le comportement que je trouve étrange ...


    Par avance, Merci
    The_mechant

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String rqt = "select tmpari.id_pari, tmpari.id_equipe1, equipe1.nom_equipe as nom1, tmpari.id_equipe2, equipe2.nom_equipe as nom2 
    from tmpari left join tmequipe as equipe1 on equipe1.id_equipe = tmpari.id_equipe1 
    left join tmequipe as equipe2 on equipe2.id_equipe = tmpari.id_equipe2";
    
    Ainsi, tu pourras directement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ResultSet rs = stmt.executeQuery(rqt);
    while (rs.next())
    {
       rs.getInt("id_pari");
       rs.getInt("id_equipe1");
       rs.getString("nom1");
       rs.getInt("id_equipe2");
       rs.getString("nom2");
    }
    Autre chose en passant, il faut faire attention aux majuscules/minuscules dans tes requêtes. Il est certain que sous Windows ça ne posera aucun problème, mais si tu portais le tout sous linux (ou autre unix), ça ne fonctionnerait plus.

    J'espère que ces quelques idées t'aideront à avancer et en passant, joyeux noël

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Essaye avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    String rqt = "select tmpari.id_pari, tmpari.id_equipe1, equipe1.nom_equipe as nom1, tmpari.id_equipe2, equipe2.nom_equipe as nom2 
    from tmpari left join tmequipe as equipe1 on equipe1.id_equipe = tmpari.id_equipe1 
    left join tmequipe as equipe2 on equipe2.id_equipe = tmpari.id_equipe2";
    
    Ainsi, tu pourras directement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ResultSet rs = stmt.executeQuery(rqt);
    while (rs.next())
    {
       rs.getInt("id_pari");
       rs.getInt("id_equipe1");
       rs.getString("nom1");
       rs.getInt("id_equipe2");
       rs.getString("nom2");
    }
    Autre chose en passant, il faut faire attention aux majuscules/minuscules dans tes requêtes. Il est certain que sous Windows ça ne posera aucun problème, mais si tu portais le tout sous linux (ou autre unix), ça ne fonctionnerait plus.

    J'espère que ces quelques idées t'aideront à avancer et en passant, joyeux noël

    A+

    Ca marche, merci beaucoup !
    Juste une histoire d'alias en fait :/
    Alors que la requête fonctionne sans soucis sous MySQL

    Pour les majuscules tu veux dire dans les requêtes ? Du genre "SELECT ..." au lieu de "select ..." ? J'avais testé sous Linux et ça passait sans soucis ...

    Mais si tu me dis que ça coince j'y ferai attention

    Merci encore et bon Noël à toi aussi

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par the_mechant Voir le message
    Pour les majuscules tu veux dire dans les requêtes ? Du genre "SELECT ..." au lieu de "select ..." ? J'avais testé sous Linux et ça passait sans soucis ...
    Non, c'est plutôt sur les noms de tables que ça va poser problème...
    "select * from MaTable" est différent (sous linux) que "select * from matable"

    Pour les instructions, il me semble qu'il n'y a pas de problème...

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. [AC-2010] Champ calculé "DiffDate" retourne mauvais résultat
    Par lptht dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/01/2015, 16h20
  2. [MySQL] Requête qui retourne un mauvais résultat
    Par chris22 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/03/2012, 16h15
  3. Réponses: 3
    Dernier message: 28/09/2011, 14h15
  4. Requete sql retourne un mauvais résultat
    Par ramoucha23 dans le forum Oracle
    Réponses: 2
    Dernier message: 29/08/2011, 11h11
  5. COUNT avec jointure mauvais résultats
    Par Invité dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/02/2010, 16h28

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