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 avec jointure complexe


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Par défaut Requête avec jointure complexe
    Bonjour à tous,

    Je viens vers vous car je ne sais pas trop comment m'y prendre sur une requête avec jointure et un triage par date descendant (ORDER BY DESC date).
    Je vous explique, je possède 5 tables, toutes structurées de la même manière :

    voici la structure :
    - id (INT) AUTO_INCREMENT - PRIMARY
    - ide (INT) (id de l'élément mère)
    - date (DATE)
    - note (TEXT)

    Voici les noms de ces 5 tables (J'ai du créer 5 tables car plusieurs lignes peuvent exister pour un élément mère) :
    exchange, refund, renew, return, sold

    Mon objectif est de créer un tableau PHP ( array ) contenant toutes les informations relative à un élément mère donnée (exemple ide=1 soit WHERE ide='1') et trier par date descendante avec en plus une cléfs qui me dirait le type (exchange,refund,etc...)
    Le tableau devrais ce construire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $array = array();
    $array[] = array('id' => (id unique ), 'type' => "exchange", 'date' => la date, 'note' => la note);
    ...
    Mais voilà je ne sais pas du tout comment faire les jointures, et j'ai un peu de mal à comprendre la doc notamment les LEFT, RIGHT et autres.
    Si une âme charitable pouvait m'aider et construire ma requête je lui en serais infiniment reconnaissant, ce n'est pas dans mes habitudes de demander à quelqu'un de faire cela à ma place, mais je patauge vraiment.

    D'avance merci pour votre aide.

    Bien à vous
    Spliffer

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Par défaut
    Je me suis lancer à essayer de comprendre le schmilblick et j'ai donc coder ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $ide = 1;
    $array = array();
    // Test requête jointure
    $req = "SELECT * FROM sold A, return B, renew C, exchange D, refund E
    WHERE A.ide='".$ide."' AND B.ide='".$ide."' AND C.ide='".$ide."' AND D.ide='".$ide."' AND E.ide='".$ide."'
    ORDER BY date DESC";
    $qry = $pdo->query($req);
    while($r = $qry->fetch(PDO::FETCH_ASSOC)){
        $array[] = array('type' => 'type ????', 'id' => $r['id'], 'date' => $r['date'], 'note' => $r['note']);
    }
    Celà vous semble correcte ?
    Si oui mon problème alors est de pouvoir dire de quel table l'information provient et le mettre à la place de "type ????"

    EDIT :
    --------
    Alors avec cette requête j'obtenais l'erreur qui me dit que le triage par date est ambigüe, j'ai donc modifier le ORDER BY, ma requête maintenant est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $req = "SELECT * FROM sold A, return B, renew C, exchange D, refund E
                WHERE A.ide='".$ide."' AND B.ide='".$ide."' AND C.ide='".$ide."' AND D.ide='".$ide."' AND E.ide='".$ide."'
                ORDER BY A.date DESC, B.date DESC, C.date DESC, D.date DESC, E.date DESC";
    Là plus d'erreur, en revanche il ne me donne que les données provenant de la table exchange mais avec les note de refund, un pti var_dump me donne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    array (size=2)
      0 => 
        array (size=4)
          'id' => string '1' (length=1)
          'ide' => string '1' (length=1)
          'sdate' => string '2016-01-26' (length=10)
          'note' => string 'Test refund' (length=11)
      1 => 
        array (size=4)
          'id' => string '1' (length=1)
          'ide' => string '1' (length=1)
          'sdate' => string '2016-01-26' (length=10)
          'note' => string 'Test refund' (length=11)
    Hors j'ai une information dans toutes les tables pour l'ide données ($ide = 1), il y'a en revanche la table exchange qui elle en possède 2, je devrais en théorie avoir 6 lignes dans ce tableau.
    Je sais donc que les données proviennent de la table exchange puisque c'est la seul qui possède 2 entrée, mais pourquoi il me met la note de refund et pas de exchange et surtout pourquoi il ne m'affiche que 2 entrée ?

    D'avance merci

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 97
    Par défaut
    Bonjour
    Si j'ai bien compris, ce qui n'est pas du tout sûr, on peut voir la chose ainsi (-->la A est la table mère) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM 
    sold A left join B on (A.ide=B.ide)
    left join renew C on (A.ide=c.ide)
    left join exchange D on (A.ide=D.ide)
    lesft join refund E on (A.ide=E.ide)
    ORDER BY a.date DESC

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Novembre 2007
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 274
    Par défaut
    Bonjour et merci pour votre participation.

    Votre méthode fonctionne très bien, toutefois on m'a rediriger vers UNION
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    UNION
    SELECT
    etc...
    ORDER BY date DESC

    Encore merci, je mets donc ce sujet en résolu
    Bien à vous

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

Discussions similaires

  1. Requête avec jointure complexe
    Par leeloo95 dans le forum Requêtes et SQL.
    Réponses: 20
    Dernier message: 16/12/2009, 15h52
  2. Requête avec jointure externe complexe
    Par dpin33 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/03/2008, 13h41
  3. Requête avec jointures
    Par Corben dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/11/2004, 12h55
  4. Mise à jour de table impossible après requête avec jointure
    Par sto dans le forum Bases de données
    Réponses: 5
    Dernier message: 17/03/2004, 13h24
  5. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33

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