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 INNER avec 4 tables


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juin 2007
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 85
    Par défaut Requête INNER avec 4 tables
    Bonjour,
    Je bloque depuis plusieurs jours sur l'affichage d'une requête avec une jointure de 4 tables. (devis_itineraires liée avec: base_contenus, hotels et tarif_hotels)
    J'ai d'abord utilisé cette requête avec 3 tables et ca fonctionnait très bien.
    Puis j'ai relié une 4eme table (tarif_hotels) sur une colonne commune code_hotel_tarif

    Cette requête est utilisé dans une boucle while.

    Depuis l'ajout de 4eme table , si lors de la requête dans la boucle, il retourne un 'code_hotel_tarif' vide de la table 'tarif_hotels, la boucle ne va pas au dela de cette ligne.
    Alors qu'auparavant, avec les 3 premières tables, même si un 'code_hotel' de la 3e table était vide, la boucle s'effectuait sur la totalité des lignes existantes respectant la condition de la requete 'WHERE a.code_circuit = '$codecircuit' AND a.version = '$version''

    Y a t-il un soucis a partir de 4 tables ?

    Franchement ca fait 4 jours que je fais des test dans tous les sens pour comprendre et cibler, mais rien à faire...

    Si quelqu'un peut m'aider

    Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    mysqli_select_db($connect, $database_connect);
    $query_contenus = "SELECT a.code_circuit, a.date, a.version, a.jour, a.code_journee, a.code_hotel, a.code_hotel_tarif, a.notes, b.titre, b.type_transport, b.langue_transport, b.type_excursion, b.langue_excursion, b.contenu_web, b.contenu_programme, b.repas, b.nuit, b.photo_contenu, c.categorie_hotel, c.nom_hotel, d.categorie_chambre
     FROM devis_itineraires a
     INNER JOIN base_contenus b ON (b.code_journee = a.code_journee)
      INNER JOIN hotels c ON (c.code_hotel = a.code_hotel)
        INNER JOIN tarif_hotels d ON (d.code_hotel_tarif = a.code_hotel_tarif)
       WHERE a.code_circuit = '$codecircuit' AND a.version = '$version'
        ORDER BY a.jour ASC";
    $contenus = mysqli_query($connect, $query_contenus) or die(mysqli_error());
    // $row_contenus = mysqli_fetch_assoc($contenus);
    $totalRows_contenus = mysqli_num_rows($contenus);

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    Y a t-il un soucis a partir de 4 tables ?
    Non, tu peux faire des jointures avec des dizaines de tables sans problèmes si besoin.

    Il faudrait commencer par identifier d'où vient l'anomalie : du script PHP, du HTML généré qui te "cache" une partie de la page, ou du SQL.

    As-tu testé ta requête sur ton MySQL Workbench ?
    Le code HTML généré est-il valide ?
    As-tu un message d'erreur PHP ?

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Teste ceci en mettant dans les exemples des données de ta base.
    J'ai modifié

    1) ta jointure pour la table d... A tort ou à raison, je me suis dit que la colonne code_hotel_tarif était plutôt dans la table hotels...
    2) renommer tes tables de façon beaucoup plus facile à retenir (initiales)
    3) mis en left join ta table tarif_hotels (signifiant en gros donnée optionnelle) au cas où les tarif ne soient pas encore saisis, ou du moins pas tous...

    mais bon, à tester dans ton phpmyadmin ou autres.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT di.code_circuit, di.date, di.version, di.jour, di.code_journee, di.code_hotel, h.code_hotel_tarif, di.notes, bc.titre, bc.type_transport, bc.langue_transport, bc.type_excursion, bc.langue_excursion, bc.contenu_web, bc.contenu_programme, bc.repas, bc.nuit, bc.photo_contenu, h.categorie_hotel, h.nom_hotel, th.categorie_chambre
    FROM devis_itineraires di
    INNER JOIN base_contenus bc ON bc.code_journee = di.code_journee
    INNER JOIN hotels h ON h.code_hotel = di.code_hotel
    LEFT JOIN tarif_hotels th ON th.code_hotel_tarif = h.code_hotel_tarif
    WHERE di.code_circuit = "EXEMPLE1" AND di.version = "EXEMPLE2"
    ORDER BY di.jour ASC
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre très actif
    Profil pro
    Administrateur
    Inscrit en
    Mai 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Administrateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2008
    Messages : 237
    Par défaut
    Faire des tests dans phpmyadmin ou workbench avec INNER JOIN et LEFT JOIN juste sur les tables devis_itineraires et tarif_hotels comme ceci

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.code_hotel_tarif, d.code_hotel_tarif
    FROM devis_itineraires a
    INNER JOIN tarif_hotels d ON d.code_hotel_tarif = a.code_hotel_tarif
    WHERE a.code_circuit = '$codecircuit' AND a.version = '$version'

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.code_hotel_tarif, d.code_hotel_tarif
    FROM devis_itineraires a
    LEFT JOIN tarif_hotels d ON d.code_hotel_tarif = a.code_hotel_tarif
    WHERE a.code_circuit = '$codecircuit' AND a.version = '$version'

    Il y a comme un problème de modélisation en amont dans votre base de données
    Il ne doit avoir de valeurs vides dans vos tables, surtout pas aux niveaux des clés étrangères.
    A vous lire c'est comme si certains dévis n'ont pas de tarifs.
    Si c'est le cas, il faudra créer une autre table à deux colonnes ex. devis_tarifs (id_devis, id_tarif)

    Si un hôtel a plusieurs tarifs, il faudra :
    - Supprimer la colonne code_hotel_tarif de la table hotels
    - Ajouter une colonne code_hotel dans la table tarif_hotels

  5. #5
    Membre actif
    Inscrit en
    Juin 2007
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 85
    Par défaut
    Bonsoir,

    Merci pour votre aide.

    J'ai juste eu à remplacer INNER JOIN par LEFT JOIN, et la boucle a fait sont travail jusqu'au bout.

    Encore merci, j'étais coincé depuis un moment

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 14/09/2011, 12h08
  2. Requête SQL avec nested tables
    Par JLemon dans le forum PL/SQL
    Réponses: 4
    Dernier message: 16/12/2010, 10h56
  3. Requête complexe avec 14 tables
    Par Kawabaumga dans le forum Développement
    Réponses: 7
    Dernier message: 14/05/2010, 10h24
  4. [SQL] Requête SQL avec 3 tables liées par la même relation
    Par lenstoi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/08/2007, 23h32
  5. Requête : Insert avec plusieurs tables
    Par bleu_ciel dans le forum Access
    Réponses: 4
    Dernier message: 01/06/2006, 21h42

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