[RESOLU] Problème Affichage de données avec INNER JOIN

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Problème Affichage de données avec INNER JOIN

Re: Problème Affichage de données avec INNER JOIN

par SmashScharrer » 28 mars 2019, 12:39

Ok nickel merci ! :D

Re: Problème Affichage de données avec INNER JOIN

par Spols » 28 mars 2019, 11:05

la meme chose que ce que tu as mis après le AS .
L'alias du champs te servira à les retrouver

un var_dump($donnees); pourra aussi t'aider à connaitre les clé présente dans ton tableau

Re: Problème Affichage de données avec INNER JOIN

par SmashScharrer » 28 mars 2019, 09:22

Ok et dans le php pour afficher du coup la ville et la distance, avec cette requête je met quoi dans $donnees=[''] pour afficher les deux villes ?
Quand je mets juste 'Ville_Nom' sa ne m'affiche que la première ville.

Re: Problème Affichage de données avec INNER JOIN

par Spols » 27 mars 2019, 09:12

V1 et V2 sont des alias pour tes tables ville. comme tu utilise 2 fois cette table, tu as besoin de cet alias pour distinguer les colonnes de chacune de ces tables.

de manière générale, un alias est utile quand un nom de table est long et que l'on ne veut pas le répèter à chaque fois.

les champs peuvent aussi avoir des alias, c'est utile quand tu as des jointures et surtout des auto-jointures. dans ta clause SELECT, V1.Ville_Id As Ville_Id_1 aura pour effet de nommer la colonne Ville_Id_1 plutot que V1.Ville_Id c'est aves ces alias que tu pourras retrouver les valeurs dans ton php

La requète que je t'ai donné devrait marché tel quel avec ton schéma, j'ai juste fait une petite faute

SELECT V1.Ville_Id, V1.Ville_Nom, distance.Dist_Km, V2.Ville_Id, V2.Ville_Nom
FROM Ville V1
INNER JOIN distance ON V1.Ville_Id = distance.Dist_NoVille1
INNER JOIN Ville V2 ON distance.Dist_NoVille2 = V2.Ville_Id AND V1.Ville_Id != V2.Ville_Id

teste là dans phpmyadmin tu peux la peaufiner en ajoutant un ORDER BY, ou ajouter des champs et des alias.

Re: Problème Affichage de données avec INNER JOIN

par SmashScharrer » 27 mars 2019, 01:05

Ecoute j'ai essayé ton code, mais il ne semble pas fonctionner. Peut-être que j'ai mis de mauvais paramètres dans mon tableau (Parametrage.php). Tu pourrais m'expliquer un peu plus en détails la requête que tu me proposes et me dire quel paramètre il faut pour afficher (genre : $donnees['???']) ?

Merci ! ;)

Re: Problème Affichage de données avec INNER JOIN

par SmashScharrer » 26 mars 2019, 22:34

Merci beaucoup de tes conseils, je vais les appliquer, et je te tiens au courant si ça fonctionne ou pas. ;)

PS : Ton V1 dans la requête c'est le nom de la table ville ou autre ?

Re: Problème Affichage de données avec INNER JOIN

par Spols » 26 mars 2019, 17:03

Je pense qu'il ne faut pas faire 2 requète mais une seule avec une double jointure ville > distance > ville

SELECT V1.Ville_Id, V1.Ville_Nom, distance.Dist_Km, V2.Ville_Id, V2.Ville_Nom
FROM Ville V1
INNER JOIN distance ON V1.Ville_Id = distance.Dist_NoVille
INNER JOIN Ville V2 ON distance.Dist_NoVille2 = V2.Ville_Id AND V1.Ville_Id != V2.Ville_Id

Avec cela tu récupèrera chaque paire de ville avec la distance entre elles

PS attention à la casse, parfois ville parfois Ville je ne sais pas si c'est important en SQL mais il vaut mieux rester cohérent.
PS2 Bravo pour le post, aussi complet c'est rare.

Problème Affichage de données avec INNER JOIN

par SmashScharrer » 26 mars 2019, 16:21

Bonjour,

Je souhaiterai afficher dans la dernière colonne du tableau de ma page (cf : Tableau dans la Page Web), la distance entre deux villes dans une case. Cette valeur que je veux afficher existe déjà dans la base. Cependant, les villes et la distance font parties de deux tables différentes : les villes sont toutes enregistrées dans la Table Villes (une partie de la table en image : cf Structure de la Table Distance), et les distances dans la table distance (cf : Structure de la Table Distance).

J'ai donc fais des INNER JOIN, tout se passe bien pour l'affichage des villes, mais pour la distance en kilomètre, je ne sais pas comment faire ?
Mon code pour le tableau et mes fonctions se trouvent ci-dessous.

Sachez que je ne peux pas modifier ma BDD car elle m'est imposée par mon professeur.

Pour info, il y a une jointure en Ville_Id -> Dist_NoVille1 et Ville_Id -> Dist_NoVille2. Et que pour l'instant, je mets la valeur de la colonne "Distance"

Mon code pour ma page (cf : Code Fonctions pour Afficher les villes dans le Tableau) et le code pour les fonctions que j'utilise (cf : Fonctions pour Afficher les villes dans le Tableau).

Comment je pourrai m'y prendre ?

Merci de votre aide :D


RESSOURCES

Table Distance
CREATE TABLE IF NOT EXISTS `distance` (
  `Dist_NoVille1` int(11) NOT NULL,
  `Dist_NoVille2` int(11) NOT NULL,
  `Dist_Km` int(11) NOT NULL,
  PRIMARY KEY (`Dist_NoVille1`,`Dist_NoVille2`),
  KEY `Dist_NoVille1` (`Dist_NoVille1`,`Dist_NoVille2`),
  KEY `Dist_NoVille2` (`Dist_NoVille2`)
) 

Table Villes
CREATE TABLE IF NOT EXISTS `ville` (
  `Ville_Id` int(11) NOT NULL AUTO_INCREMENT,
  `Ville_CP` varchar(5) NOT NULL,
  `Ville_Nom` varchar(50) NOT NULL,
  `Ville_Population` int(11) NOT NULL,
  `Ville_Cat` int(1) NOT NULL,
  PRIMARY KEY (`Ville_Id`)
)

Tableau dans la Page Web
<?php

    // Afficher De    
    function DistanceVillesA($connexion){
        try{
            $req = $connexion->prepare("SELECT Ville_Id, Ville_Nom FROM Ville INNER JOIN distance ON ville.Ville_Id = distance.Dist_NoVille1");
            $req->execute();
            return $req;
        }
        catch(Exception $e){
            die(print("Erreur : " . $e->getMessage()));
        }
    }    

    // Afficher A
    function DistanceVillesB($connexion){
        try{
            $req = $connexion->prepare("SELECT Ville_Id, Ville_Nom FROM Ville INNER JOIN distance ON ville.Ville_Id = distance.Dist_NoVille2");
            $req->execute();
            return $req;
        }
        catch(Exception $e){
            die(print("Erreur : " . $e->getMessage()));
        }
    }

?>
Code Tableau Parametrage.php
// Récup Villes pour Tableau
$req5 = DistanceVillesA($connexion);
$req6 = DistanceVillesB($connexion);

// Tableau pour Afficher Valeurs
<table border="1" cellpadding="10">
<tr>
                                                    
                                            <th>De</th>
                                            <th>A</th>
                                            <th>Distance</th>
                                                    
                                        </tr>

                                        <?php 
                                            
                                            while(($donnees = $req5->fetch()) AND ($donnees2 = $req6->fetch())){

                                        ?>

                                        <tr>

                                            <td align="center"><?php print($donnees['Ville_Nom']);?></td>
                                            <td align="center"><?php print($donnees2['Ville_Nom']);?></td>
                                            <td align="center"><?php print(0);?></td>
                                                                                            
                                        </tr>

                                        <?php

                                            }
                                                            
                                        ?>

Fonctions PHP
// Afficher De    
    function DistanceVillesA($connexion){
        try{
            $req = $connexion->prepare("SELECT Ville_Id, Ville_Nom FROM Ville INNER JOIN distance ON ville.Ville_Id = distance.Dist_NoVille1");
            $req->execute();
            return $req;
        }
        catch(Exception $e){
            die(print("Erreur : " . $e->getMessage()));
        }
    }    

    // Afficher A
    function DistanceVillesB($connexion){
        try{
            $req = $connexion->prepare("SELECT Ville_Id, Ville_Nom FROM Ville INNER JOIN distance ON ville.Ville_Id = distance.Dist_NoVille2");
            $req->execute();
            return $req;
        }
        catch(Exception $e){
            die(print("Erreur : " . $e->getMessage()));
        }
    }