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 :

[SQL] Requête SELECT et INNER JOIN


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut [SQL] Requête SELECT et INNER JOIN
    Bonjour,

    Pour info j'utilise php 5 et mysql 5.0.41.

    Mon problème est le suivant je souhaite afficher les résultats de la table tarifs tout en affichant des infos de 3 autres tables donc j'ai fait ma requête avec des INNER JOIN seulement problème ça me fait un produit cartésien entre tous les champs de mes tables.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $affiche = mysql_query("SELECT * FROM Tarif T 
                           INNER JOIN Saison S ON T.id_saison = S.id_s 
                           INNER JOIN Duree D ON T.id_duree = D.id_d 
                           INNER JOIN Categorie C ON T.id_categorie = C.id_c") 
                           or die ('Erreur<br>'.$affiche.'<br>'.mysql_error());
    Pour info si je rajoute le mot clef DISTINCT ça ne change rien.

    Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    A priori, ta requête est OK. Combien as-tu de lignes dans chaque table ? Combien en obtiens-tu dans ta requête ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Nombre d'enregistrement :

    Table Tarif : 192
    Table Saison : 6
    Table Duree : 8
    Table Categorie : 6


    Nombre qui sort de la requête :

    Table Tarif : 128
    Table Saison : 128
    Table Duree : 128
    Table Categorie : 128

    pour obtenir les résultats j'ai fais ç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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    $affiche = mysql_query("SELECT * FROM Tarif T 
                           INNER JOIN Saison S ON T.id_saison = S.id_s 
                           INNER JOIN Duree D ON T.id_duree = D.id_d 
                           INNER JOIN Categorie C ON T.id_categorie = C.id_c") 
                           or die ('Erreur<br>'.$affiche.'<br>'.mysql_error());
    while($row = mysql_fetch_assoc($affiche)){
        //Recup info saison
        $tab['id_s'][] = $row['id_s'];
        $tab['nom_saison'][] = $row['nom_saison'];
        $tab['lim_basse'][] = $row['lim_basse'];
        $tab['lim_haute'][] = $row['lim_haute'];
        //Recup info duree
        $tab['id_d'][] = $row['id_d'];
        $tab['nom_duree'][] = $row['nom_duree'];
        $tab['lim_duree_basse'][] = $row['lim_duree_basse'];
        $tab['lim_duree_haute'][] = $row['lim_duree_haute'];
        //Recup info categorie
        $tab['id_c'][] = $row['id_c'];
        $tab['nom_categorie'][] = $row['nom_categorie'];
        //Recup info tarif
        $tab['id_t'][] = $row['id_t'];
        $tab['id_saison'][] = $row['id_saison'];
        $tab['id_duree'][] = $row['id_duree'];
        $tab['id_categorie'][] = $row['id_categorie'];
        $tab['loca_tarif'][] = $row['loca_tarif'];
    }
    $Nb_saison = count($tab['id_s']);
    $Nb_duree = count($tab['id_d']);
    $Nb_categorie = count($tab['id_c']);
    $Nb_tarif = count($tab['id_t']);
    ?>
    <div>
    <?php
    echo 'Nb_saison : '.$Nb_saison.'<br />';
    echo 'Nb_duree : '.$Nb_duree.'<br />';
    echo 'Nb_categorie : '.$Nb_categorie.'<br />';
    echo 'Nb_tarif : '.$Nb_tarif.'<br />';
    ?>
    </div>
    Je comprends pas pourquoi j'ai ce genre de résultat et ce qui cloche dans ma requête.

    En attendant pour que ça marche j'ai du faire 4 requêtes SQL différente mais j'aimerai bien optimiser en une seule requête si c'est possible

    Merci d'avance

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Un produit cartésien, c'est quand tu as toutes les combinaison entre toutes les lignes de toutes tes tables, ce qui te ferait 192 * 6 * 8 * 6 soit 55 296 lignes.

    Quel résultat obtiens-tu, et qu'est qui te semble clocher ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre averti Avatar de makmaoui
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2007
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2007
    Messages : 283
    Points : 368
    Points
    368
    Par défaut
    Salut,

    ta jointure ne te renverra que les enregistrements présents dans les 4 tables : par exemple si un tarif a une saison qui n'est pas dans la table saison OU s'il n'en a pas du tout il ne sera pas dans le résultat de la requête ... Si tu veux y arriver il va falloir faire des jointures gauche et droite .... Si tu fais un "count(*)" sur chaque table, cela sera moins lourd et plus clair.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Ben c'est simple

    regarde mes test :

    Affichage avec 4 requêtes : http://location-voiture.creation3w.com/test/test-1.php

    Affichage avec la requête SQL que j'ai marqué plus haut
    http://location-voiture.creation3w.com/test/test-2.php


    Pour moi ça fait un produit cartésien non ce que je souhaite c'est de pouvoir avoir un affichage correcte avec une seul requête mais là j'en suis loin.

    Vous avez une idée pourquoi ça fait ça ?

    Code source complet avec les 4 requete SQL
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Ajout Des Tarif</title>
    <style type="text/css" media="all">
    @import url(style.css);
    </style>
     
    </head>
     
    <body bgcolor="#677BAD">
    <div id="titre">
    TEST 4 requêtes SQL
    </div>
    <div id="conteneur2">
        <div id="contenu">
    <?php
    include('sql/conf.php');
    include('inc/gomonth.php');
    $afficheSaison = mysql_query("SELECT * FROM Saison S order by S.id_s ASC") or die (mysql_error());
    $afficheDuree = mysql_query("SELECT * FROM Duree D order by D.id_d ASC") or die (mysql_error());
    $afficheCategorie = mysql_query("SELECT * FROM Categorie C order by C.nom_categorie ASC") or die (mysql_error());
    $afficheTarif = mysql_query("SELECT * FROM Tarif T order by T.id_t ASC") or die (mysql_error());
    while($rowS = mysql_fetch_assoc($afficheSaison)){
        //Recup info saison
        $tab['id_s'][] = $rowS['id_s'];
        $tab['nom_saison'][] = $rowS['nom_saison'];
        $tab['lim_basse'][] = $rowS['lim_basse'];
        $tab['lim_haute'][] = $rowS['lim_haute'];
    }
    while($rowD = mysql_fetch_assoc($afficheDuree)){
        //Recup info duree
        $tab['id_d'][] = $rowD['id_d'];
        $tab['nom_duree'][] = $rowD['nom_duree'];
        $tab['lim_duree_basse'][] = $rowD['lim_duree_basse'];
        $tab['lim_duree_haute'][] = $rowD['lim_duree_haute'];
    }
    while($rowC = mysql_fetch_assoc($afficheCategorie)){
        //Recup info categorie
        $tab['id_c'][] = $rowC['id_c'];
        $tab['nom_categorie'][] = $rowC['nom_categorie'];
    }
    while($rowT = mysql_fetch_assoc($afficheTarif)){
        //Recup info tarif
        $tab['id_t'][] = $rowT['id_t'];
        $tab['id_saison'][] = $rowT['id_saison'];
        $tab['id_duree'][] = $rowT['id_duree'];
        $tab['id_categorie'][] = $rowT['id_categorie'];
        $tab['loca_tarif'][] = $rowT['loca_tarif'];
    }
    $Nb_saison = count($tab['id_s']);
    $Nb_duree = count($tab['id_d']);
    $Nb_categorie = count($tab['id_c']);
    ?>
    <div id="visualisation3">
    <?php
    $i=0;
    for($i=0; $i<$Nb_saison; $i++){
    ?>
        <table cellpadding="7" cellspacing="0" border="1" width="100%" align="center">
        <tr>
        <td align="center" class="headtable2" colspan="<?php echo ($Nb_duree+1);?>">
        <?php echo $tab['nom_saison'][$i].' : du '.toSql($tab['lim_basse'][$i]).' au '.toSql($tab['lim_haute'][$i]); ?>
        </td>
        </tr><tr>
        <td align="center" class="headtable3">Cat&eacute;gories</td>
        <?php
        for($j=0; $j<$Nb_duree; $j++){
            echo '<td align="center" class="headtable3">'.$tab['nom_duree'][$j].'</td>';
        } //Fin de la boucle j pour les tranches de durée
        ?>
        </tr>
        <?php
        if(!isset($m)){
            $m = 0;
        }
        for($k=0; $k<$Nb_categorie; $k++){
            echo '<tr><td align="center" class="headtable3">'.$tab['nom_categorie'][$k].'</td>';
            for($l=0; $l<$Nb_duree; $l++){
                echo '<td align="center" class="colorcell">'.$tab['loca_tarif'][$m].' &euro;</td>';
            $m++;
            } //Fin de la boucle l pour les cellules
            echo '</tr>';
        } // Fin de la boucle k pour les catégories
        ?>
        </table>
        <br /><br />
    <?php
    } //Fin de la boucle i pour les saisons
    ?>
    </div>
        </div>
    </div>
    </body>
    </html>
    Code source complet avec une seul requête sql
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Ajout Des Tarif</title>
    <style type="text/css" media="all">
    @import url(style.css);
    </style>
    </head>
     
    <body bgcolor="#677BAD">
    <div id="titre">
    TEST une requête SQL
    </div>
    <div id="conteneur2">
        <div id="contenu">
    <?php
    include('sql/conf.php');
    include('inc/gomonth.php');
     
    $affiche = mysql_query("SELECT * FROM Tarif T 
                           INNER JOIN Saison S ON T.id_saison = S.id_s 
                           INNER JOIN Duree D ON T.id_duree = D.id_d 
                           INNER JOIN Categorie C ON T.id_categorie = C.id_c") 
                           or die ('Erreur<br>'.$affiche.'<br>'.mysql_error());
    while($row = mysql_fetch_assoc($affiche)){
        //Recup info saison
        $tab['id_s'][] = $row['id_s'];
        $tab['nom_saison'][] = $row['nom_saison'];
        $tab['lim_basse'][] = $row['lim_basse'];
        $tab['lim_haute'][] = $row['lim_haute'];
        //Recup info duree
        $tab['id_d'][] = $row['id_d'];
        $tab['nom_duree'][] = $row['nom_duree'];
        $tab['lim_duree_basse'][] = $row['lim_duree_basse'];
        $tab['lim_duree_haute'][] = $row['lim_duree_haute'];
        //Recup info categorie
        $tab['id_c'][] = $row['id_c'];
        $tab['nom_categorie'][] = $row['nom_categorie'];
        //Recup info tarif
        $tab['id_t'][] = $row['id_t'];
        $tab['id_saison'][] = $row['id_saison'];
        $tab['id_duree'][] = $row['id_duree'];
        $tab['id_categorie'][] = $row['id_categorie'];
        $tab['loca_tarif'][] = $row['loca_tarif'];
    }
    $Nb_saison = count($tab['id_s']);
    $Nb_duree = count($tab['id_d']);
    $Nb_categorie = count($tab['id_c']);
    $Nb_tarif = count($tab['id_t']);
    ?>
    <div id="visualisation3">
    <?php
    $i=0;
    for($i=0; $i<$Nb_saison; $i++){
    ?>
        <table cellpadding="7" cellspacing="0" border="1" width="100%" align="center">
        <tr>
        <td align="center" class="headtable2" colspan="<?php echo ($Nb_duree+1);?>">
        <?php echo $tab['nom_saison'][$i].' : du '.toSql($tab['lim_basse'][$i]).' au '.toSql($tab['lim_haute'][$i]); ?>
        </td>
        </tr><tr>
        <td align="center" class="headtable3">Cat&eacute;gories</td>
        <?php
        for($j=0; $j<$Nb_duree; $j++){
            echo '<td align="center" class="headtable3">'.$tab['nom_duree'][$j].'</td>';
        } //Fin de la boucle j pour les tranches de durée
        ?>
        </tr>
        <?php
        if(!isset($m)){
            $m = 0;
        }
        for($k=0; $k<$Nb_categorie; $k++){
            echo '<tr><td align="center" class="headtable3">'.$tab['nom_categorie'][$k].'</td>';
            for($l=0; $l<$Nb_duree; $l++){
                echo '<td align="center" class="colorcell">'.$tab['loca_tarif'][$m].' &euro;</td>';
            $m++;
            } //Fin de la boucle l pour les cellules
            echo '</tr>';
        } // Fin de la boucle k pour les catégories
        ?>
        </table>
        <br /><br />
    <?php
    } //Fin de la boucle i pour les saisons
    ?>
    </div>
        </div>
    </div>
    </body>
    </html>
    Voilà merci

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Pourquoi tu me dis 128 lignes alors qu'il y en a quasiment assez pour crasher mon Mozilla ?

    tu ne peux pas juste faire un mysql_num_rows() après exécuté ta requête ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  8. #8
    Membre habitué
    Homme Profil pro
    Ingénieur Informatique
    Inscrit en
    Décembre 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur Informatique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 146
    Points : 158
    Points
    158
    Par défaut
    Oui ou simplement un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT count(*) 
    FROM Tarif T 
         INNER JOIN Saison S ON T.id_saison = S.id_s 
         INNER JOIN Duree D ON T.id_duree = D.id_d 
         INNER JOIN Categorie C ON T.id_categorie = C.id_c
    Mon blog est sur https://arphonis.fr et bientôt d'autres fonctionnalités seront disponible dessus.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Pourquoi je disais 128 tous simplement parce que ça me dis 128 lol c'est ça qui est bizarre

    voici ce que j'ai fais pour avoir 128 :

    1er test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $affiche = mysql_query("SELECT * FROM Tarif T 
                           INNER JOIN Saison S ON T.id_saison = S.id_s 
                           INNER JOIN Duree D ON T.id_duree = D.id_d 
                           INNER JOIN Categorie C ON T.id_categorie = C.id_c") 
                           or die ('Erreur<br>'.$affiche.'<br>'.mysql_error());
    echo mysql_num_rows($affiche);
    ça donne 128

    2ème test de fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $affiche = mysql_query("SELECT count(*) 
    FROM Tarif T 
         INNER JOIN Saison S ON T.id_saison = S.id_s 
         INNER JOIN Duree D ON T.id_duree = D.id_d 
         INNER JOIN Categorie C ON T.id_categorie = C.id_c");
    $count= mysql_fetch_row($affiche);
    echo $count[0];
    Donne aussi 128

    bizarre non ?

    Bon ceci dis ça c'est bizarre certes mais que dois-je modifier sur ma requête pour que ça n'affiche pas 50000 résultats avec des doublons ?

    En fait faudrai arrivé à faire des 4 requêtes sql que j'ai mis dans mon post précédent en une seule si c'est possible

    Merci

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Je pense que ta requête est parfaitement OK, mais que c'est ton code PHP qui est dingue.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Je veux bien remettre en cause mon code php mais je vais vous l'expliquer avant.

    Il y a 4 boucles :

    La première boucle permet de faire autant de tableau qu'il y a de saison.

    La seconde me permet de faire autant de colonnes qu'il y a de tranches de durée dans une saison.

    La troisième et la quatrième marchant ensemble me permet de faire autant de ligne qu'il y a de catégorie tout en remplissant les cellules par rapport au nombre de tranche de durée tout en incrémentant la variable $m afin de prendre les résultats de la requêtes SQL (Les tarifs en l'occurrence).

    Je ne pense pas que je puisse réellement faire autrement que de faire 4 boucles afin de construire mes différents tableaux, de plus si mon code php était si dingue que ça pourquoi es ce qu'il marche parfaitement avec mes 4 requêtes SQL que j'ai poster plus haut et pourquoi il ne marcherai pas lorsque je fais une seul requête?

    Autre point je doute que ma requête SQL qui regroupe les 4 requêtes en une soit correcte car ça ne retourne que 128 hors dans la table tarifs je rappel que j'ai 192 résultats donc il manques forcement de plus si je fais un count sur les autres tables j'ai 128 partout alors que les autres table possède 6 - 8 et 6 enregistrement il y a forcement une erreur quelque part ou alors ma requête est correcte mais elle ne sert pas à faire ce que je veux.

    Ce que je souhaite c'est d'afficher les tarifs de la table Tarifs cette tables est composé des champs id_t (auto incrément de la table tarif), id_saison (correspondant à id_s de la saison), id_duree(correspondant à id_d de la table duree), id_categorie(correspondant à id_c de la table categorie), et du champ loca_tarif (c'est les tarifs).

    donc ce que je veux faire vous devez le devinez c'est d'afficher les tarifs tout en récupérant les infos des tables relative à chaque id.

    Exemple l'enregistrement suivant de la table tarifs :

    id_t id_saison id_duree id_categorie loca_tarif
    1 1 2 1 30

    donc je veux recupérer l'enregistrement où l'id_s correspond à 1 pour la table saison où id_d correspond à 2 pour la table duree et où id_c correspond à 1 pour la table categorie ect ect ect ....

    ce qui signifie que la requête SQL suivante :

    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
     
    <?php
    $afficheSaison = mysql_query("SELECT * FROM Saison S order by S.id_s ASC") or die (mysql_error());
    $afficheDuree = mysql_query("SELECT * FROM Duree D order by D.id_d ASC") or die (mysql_error());
    $afficheCategorie = mysql_query("SELECT * FROM Categorie C order by C.nom_categorie ASC") or die (mysql_error());
    $afficheTarif = mysql_query("SELECT * FROM Tarif T order by T.id_t ASC") or die (mysql_error());
    while($rowS = mysql_fetch_assoc($afficheSaison)){
        //Recup info saison
        $tab['id_s'][] = $rowS['id_s'];
        $tab['nom_saison'][] = $rowS['nom_saison'];
        $tab['lim_basse'][] = $rowS['lim_basse'];
        $tab['lim_haute'][] = $rowS['lim_haute'];
    }
    while($rowD = mysql_fetch_assoc($afficheDuree)){
        //Recup info duree
        $tab['id_d'][] = $rowD['id_d'];
        $tab['nom_duree'][] = $rowD['nom_duree'];
        $tab['lim_duree_basse'][] = $rowD['lim_duree_basse'];
        $tab['lim_duree_haute'][] = $rowD['lim_duree_haute'];
    }
    while($rowC = mysql_fetch_assoc($afficheCategorie)){
        //Recup info categorie
        $tab['id_c'][] = $rowC['id_c'];
        $tab['nom_categorie'][] = $rowC['nom_categorie'];
    }
    while($rowT = mysql_fetch_assoc($afficheTarif)){
        //Recup info tarif
        $tab['id_t'][] = $rowT['id_t'];
        $tab['id_saison'][] = $rowT['id_saison'];
        $tab['id_duree'][] = $rowT['id_duree'];
        $tab['id_categorie'][] = $rowT['id_categorie'];
        $tab['loca_tarif'][] = $rowT['loca_tarif'];
    }
    $Nb_saison = count($tab['id_s']);
    $Nb_duree = count($tab['id_d']);
    $Nb_categorie = count($tab['id_c']);
    ?>
    Je souhaite si c'est possible la convertir en une seule requête

    Dîtes moi si je ne suis pas clair mais je pense que le plus simple pour comprendre est de lire mes 4 requêtes ci-dessus et ce que je veux c'est en faire qu'une.

    Merci d'avance

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    On va commencer par le commencement
    Que doit te retourner exactement ta requete ? Que veux tu afficher ?

    A ce que j'ai compris tu veux afficher ta liste de tarif, c'est a dire 192 résultats avec les données des autres tables qui s'y rattachent.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Oui c'est exactement ça en fait tu peux voir ce que je veux afficher ici :

    http://location-voiture.creation3w.com/test/test-1.php

    Ce que tu vois sur cette page c'est mon test avec les 4 requêtes SQL.

    De plus sur cette page :

    http://location-voiture.creation3w.com/test/test-2.php

    Attention à ton navigateur ça risque de planté on peut voir que ma requête SQL déconne.

    PS : J'ai essayé la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $affiche = mysql_query("SELECT * FROM Tarif T 
                           LEFT JOIN Saison S ON T.id_saison = S.id_s 
                           LEFT JOIN Duree D ON T.id_duree = D.id_d 
                           LEFT JOIN Categorie C ON T.id_categorie = C.id_c") 
                           or die ('Erreur<br>'.$affiche.'<br>'.mysql_error());
    ça marche pas c'est l'affichage que vous avez sur la page test-2.php

    Merci

  14. #14
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Ah oui effectivement, il y a un léger souci. Es tu sur que ce n'est pas ta boucle a l'affichage qui déconne ? As tu passé ta requete dans phpmyadmin pour voir ce que ça retourne ?

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Bien pensé l'idée de voir ce que ça donne dans PhpMyAdmin, avec Left Join tel que j'ai écrit la requête plus haut ça me donne pile ce que je veux . La chose que je n'avais pas compris c'est que ça me les tris directement ce qui fait que j'ai plus besoin de boucle.

    Je vais devoir faire un Flag pour finir les ligne et finir les tableaux.

    Merci

    Je mettrais mon code php terminer dans l'après midi une fois que je l'aurai

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Le coup de tester dans phpmyadmin c'est toujours un bon test.
    Pour ma part, dès qu'une requete marche pas, je la colle dans phpmyadmin ou sqldeveloper (oracle, mysql) et je vérifie qu'il est correct.

    On pense trop souvent que le php est en cause alors que c'est le SQL qui fait n'importe quoi. Dans ton cas, c'est l'inverse mais ça t'a permis de voir ou était ton erreur

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2006
    Messages : 61
    Points : 39
    Points
    39
    Par défaut
    Bon ben tout ça pour rien

    Car lorsque je fais ma requête avec les left join ont à vu plus haut que ça me retourner les bon résultat le problème c'est que je ne peux pas utilisé les résultat pour fabriquer mon tableau.

    Un tableau ce fait ligne par ligne en remplissant chaque cellule et c'est pas jouable je pensais simplifier en faisant une requête mais en faite c'est l'inverse dommage.

    Enfin si qqun voit comment faire je suis quand même preneur

    Merci encore pour votre aide

    A+

  18. #18
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par polemoss Voir le message
    Un tableau ce fait ligne par ligne en remplissant chaque cellule et c'est pas jouable je pensais simplifier en faisant une requête mais en faite c'est l'inverse dommage.
    PHP lira les résultats ligne à ligne en remplissant chaque cellule. Où est le problème ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  19. #19
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2007
    Messages : 340
    Points : 350
    Points
    350
    Par défaut
    Je ne vois pas le problème non plus.

Discussions similaires

  1. [SQL] Requête SELECT avec un paramètre pour choisir une colonne
    Par svergeylen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/12/2007, 17h36
  2. [SQL] requête SELECT impossible
    Par loopback dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/11/2007, 18h57
  3. [SQL] Requête dans une requête...avec des INNER JOIN!
    Par PedroBD dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 06/04/2006, 08h26
  4. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55
  5. Un doute...select avec INNER JOIN
    Par Thierry8 dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/12/2005, 16h14

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