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 :

Jointures et affichage [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut Jointures et affichage
    Bonjour à tous,

    Voila, essayant de créer un site "base de données" j'ai commencé (pour l'affichage) à multiplier les requêtes jusqu'à se qu'on me dise... utilise les jointures^^ et maintenant j'ai un soucis,
    ma page php récupère une variable GET et lance un requête (la variable passée est l'id pour la requète)

    ma base dispose de ceci:

    à l'inscription on enregistre le nom de la personne et une id:

    table1 : id - auteur(nom)
    puis les livres écrits par celui-ci, id de l'auteur pour savoir puis le nom du livre:

    table2 : id - livre
    et pour finir les textes simple, id de l'auteur et le texte:

    table3 : id - texte
    Voila^^ donc avant je lançais 3 requête avec l'id, pour avoir son nom, lister ses livres et ses textes... puis avec les jointures je fait la demande directement dans les 3 bases par rapport à l'id.

    jusque là tout a bien^^ j'ai tester toutes mes données sortent super bien et tout mais pour l'affichage cela pose un problème, pour sortir toute les valeurs je fait un while() seulement cela m'empêche de mettre les valeur correctement sur ma page:

    while(fetch_array) //j'écrit pas tout hein^^
    {$livre}
    va me lister tout les livres et ensuite si je fait un

    while(fetch_array)
    {$texte}
    rien ne sort... car les valeur on sauté avec le 1er while()

    et si je fait

    while(fetch_array)
    {$livre
    $texte}
    cela me sort tout n'importe comment enfin 1 livre puis 1 texte etc... (pas cool pour l'affichage)

    donc ma question: est-il possible de faire un affichage correcte avec les jointures? si oui est-il possible d'avoir une petite explication s'il vous plait^^

    (j'espère que mon roman n'est pas trop long et qu'il est compréhensible)
    Merci à tous.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu ne peux pas faire une jointure pertinente entre livre et texte puisque ces tables n'ont pas de champ pouvant les joindre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    ah^^ mince j'ai oublier de préciser, l'id donné à l'auteur est mise avec les livres et les texte, les champs id avec livres et texte sont en faite l'id de l'auteur... désolé j'ai oublié de préciser se point la.

  4. #4
    jnore
    Invité(e)
    Par défaut
    Bonsoir,

    Ce qu'il serait interessant c'est que tu nous donnes l'écriture de ta requête ainsi que le resultat que tu attends à l'écran.
    Avec cela, on pourra constuire.

    En tout cas, par rapport à te 2ème boucle, il est normal qu'au deuxieme while, il ne sorte aucun resultat --> Le pointeur de la ressource se trouve en fin après ta première boucle --> Il faut donc le faire revenir à zero.

    Cette opération peut différer en fonction du moteur de BDD --> Quel est-il?

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    , l'id donné à l'auteur est mise avec les livres et les texte, les champs id avec livres et texte sont en faite l'id de l'auteur
    Non j'avais bien compris ca.
    Mais une jointure lie des données horizontalement :

    table 1 jointure table2
    champ 1A - champ 1B - champ 1C -------- champ 2C - champ 2Y - champ 2z

    dans ton cas les informations du texte et les informations du livre n'ont pas de rapport l'une avec l'autre
    livre "toto", ecrit en 1928 ---> auteur <--- texte 'titi' ecrit en 1942
    d'ailleurs ta requete te sortirait toutes les combinaisons texte/livre possibles pour l'auteur.

    au contraire tu peux lier l'auteur et le texte ou le livre, la ca a du sens :
    livre "toto", ecrit en 1974 -->auteur<-- M. xxxxx, né en 1928

    Si tu veux recuperer les deux sources en une seule requete, tu peux toujours faire une UNION des deux requetes.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    ah ok je comprend^^ donc j'explique ma requête déjà

    alors on a donc:

    table1 : id - auteur
    table2 : id(auteur) - livre
    table3 : id(auteur) - texte
    ma requête fait ceci:

    $requete1 = mysql_query('SELECT
    base_livre.id,
    base_livre.livre,
    base_texte.id,
    base_texte.texte
    FROM base_livre
    LEFT JOIN base_texte
    ON base_livre.id = base_texte.id
    WHERE base_livre.id = "'.$choix.'" ');
    voila donc ceci est pour prendre les livres et texte par rapport à l'id de l'auteur, le nom de l'auteur est repris à part.

    Pour l'affichage j'aimerais avoir ceci:

    <table>
    <tr>

    <td>
    livre 1 <br>
    livre 2 <br>
    etc... <br>
    </td>

    <td>
    texte 1 <br>
    etc... <br>
    </td>

    </tr>
    </table>
    se qui me ferais donc 2 colonnes avec à gauche les livres et à droite les textes, au début j'avais une requête et un while() dans le premier <td> pour lister les livres puis dans le 2eme <td> un while() pour lister les texte, ensuite j'ai essayé de faire toujours 2 while() mais une seul requête avec jointure qui ne donne pas se que je veut et je ne peut pas faire que 1 while() car ça me mélangerais les colonnes.

    Voila, je ne connais pas la façon de remettre à zéro, je ne savais pas que ça existais, j'apprends sur le net je connais as trop mal mais pour le petits truck c'est pas facile, pour se qui est de l'union si tu a une adresse de cours ou quoi, je ne sais pas pour programmé j'utilise WAMP v1.7.2 mais sur mon fournisseur ça change peut-être, je ne sais même pas la version de WAMP donc faudra que je regarde ça de plus près, si tu a aussi un cours ou quoi sur la remise à zéro je suis preneur^^ plus j'apprends mieux c'est .

    Merci à vous.

    j'ai fais quelques recherche sur la remise à zéro et sur les UNION, au niveau de la remise à zéro cela na pas été très concluant, je suis tombé sur un seul truck, reset($ma_variable) qui ne marche pas et malgré d'autre recherche je n'est rien de différent, pour les UNION j'ai trouvé pas mal de choses mais cela sorts quand même toute la requête dans une seul variable, enfin bref je débute donc je fait peut-être des erreur et je comprend peut-être mal mais se qui m'intéresse surtout c'est d'apprendre, donc même si on m'envoie que des liens j'aimerais qu'on me guide :p
    Juste pas le lien google.... ça c'est les boulets qui veulent juste monter leurs taux de messages qui font ça mici.

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Qu'est ce que tu entends par remise à zero ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    alors en faite j'ai fait une recherche par rapport à se qu'il disais j'entends par remise à zéro en faite la remise du pointeur sur son point de départ, car après la boucle il est à la fin.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    A moins que tu ne veuilles ré-afficher la meme chose deux fois, je ne vois pas pourquoi tu voudrais rembobiner ta liste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ON base_livre.id = base_texte.id
    Pourquoi l'id du livre serait egale a l'id du texte ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    jnore
    Invité(e)
    Par défaut
    Allez un petit script vite fait en espérant qu'il te conviendra:

    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
     
    $res=/////////////////ICI RESSOURCE PROVENANT DE TA REQUETE
    $livre="";
    $tableau=Array();
    $i=0;
    while($tab=mysql_fetch_array($res))//ON SCRUTE LA RESSOURCE PROVENANT DE MYSQL
    	{	
    	if($livre!=$tab['livre'])
    		{
    		$i++;
    		$tableau[$i]=array($tab['livre']=>$tab['texte']);
    		}
    		else
    		{
    		$tableau[$i][$tab['livre']].=$tab['texte'];
    		}
    	$livre=$tab['livre'];	
     
    	}
     
    echo '<table>';
    foreach($tableau as $livre)
    	{
    	echo '<tr>';
    		echo '<td>';
    			echo key($livre);
    		echo '<td>';
    		echo '<td>';
    			echo $livre[key($livre)];
    		echo '<td>';
    	echo '</tr>';
    	}
    echo '</table>';
    Je dois m'en aller, dis moi si ok

    A+

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    merci Jnore je vais de se pas réglé pour ma page et tester ceci, pour Sabotage, je tes mis un texte au début et tu ma dit "Non j'avais bien compris ça." , je tes dit que l'id marqué sur les livres et textes n'est pas une id de quantification mais l'id de l'auteur pour savoir quel livres et textes appartiennent à qui^^ autrement dit quand l'auteur ou quelqu'un attribut un livre l'id n'est pas en auto incrément mais est donné par l'id de l'auteur d'où ma recherche sur les livres et textes par leurs id enfin par l'id qui leur est attribué et qui correspond à leur auteur... donc par rapport à ça, je retrouve les livres et textes et je voudrais juste remettre à zéro pour, comme je les dit, refaire le second affichage mais ça c'est écrit plus haut -_-.

    Merci

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Donc tu n'as pas du tout tenu compte de ce que j'ai expliqué : si un livre A et un texte B n'ont pas de relation l'un avec l'autre, ca n'a pas de sens de les joindre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Bah je les joint pour faire avoir tout en une requête, si je veut récupérer des valeurs qui n'ont aucun rapport entre elle mais un rapport avec un chose extérieure je suis donc obligé de faire plusieurs requête? par exemple mes livres non aucun rapport avec les texte mais tout 2 se rapport à l'auteur... moi je voulais juste faire une seul requête parce que sur ma page j'en est encore pas mal et ça ralentis tout. ensuite une jointure ne sert donc à rien de bien puissant si on doit sortir tout se qu'elle donne en une fois...

    Re-edit:

    juste pour savoir quel différence l'UNION apporte-il j'ai essayé de trouver des infos mais je n'est pas bien compris la différence dans le concept.

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Les jointures sont fondamentales dans des bases de données relationnelles.
    si par exemple tu veux toutes les informations des livres, y compris sur leur auteur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM livre JOIN auteur ON livre.auteur_id = auteur.auteur_id
    UNION sert a rassembler deux requetes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT livre FROM livre WHERE auteur = xxx UNION SELECT texte FROM texte where auteur = xxx
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #15
    jnore
    Invité(e)
    Par défaut
    Je confirme

    Le résultat sera juste que si la requête est valide.
    Il faut avoir une bonne vision de ce que tu veux pour que le résultat soit judicieux.
    Je dirais même que la requête doit être convenablement triée...
    Dernière modification par jnore ; 09/05/2009 à 21h17.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2009
    Messages : 26
    Par défaut
    bonjour,

    Union et jointure
    Pour essayer de le dire simplement je dirais que :

    - l'union cumule des lignes
    - la jointure cumule des colonnes

    L'union nécessite des tables ou SELECT de même structures (de même schémas)
    La jointure peut travailler sur des schémas différents.

    L'union sert à "accumuler" des enregistrements des tables différentes pour avoir la "somme" des enregistrements des 2 tables
    Par exemple les clients français et les clients du reste du monde.
    Par exemple les personnels civils et les personnels militaires du ministère de la défense, etc ....

    La jointure va servir à "accumuler" (concaténer) des colonnes des différentes tables.
    Admettons que l'on ait une table clients(id, nom, prenom, adresse, cp) et une table villes(cp, ville)
    Et que l'on veuille produire des étiquettes pour envoyer un mailing postal.
    Il va falloir réunir certains éléments de clients et de villes.
    Ce sera la jointure qui le permettra.
    Voilà.
    Pour des approfondissements il doit bien y avoir moultes tutoriels SQL sur ce site.

    bonne journée

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Ok et bah merci pour m'avoir aidé, avec se que vous avez dit j'ai finalement réussis à trouver comment faire... donc voila je reste sur mes jointures qui marchent mal mais qui me diminue le nombre de requêtes énormément et pour sortir tout j'utilise ceci:

    mysql_data_seek($result, 0);
    qui remet le pointeur au début, pour ceux que ça intéresse, c'est par ici.

    Donc avec ceci j'utilise plusieurs fois mon résultats en prenant à ma guise les cases que je veut... voila

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

Discussions similaires

  1. Jointure et affichage par nombre de commentaires
    Par Him dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/09/2009, 09h49
  2. [MySQL] Jointure et affichage tableau
    Par Cruelo dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 27/03/2009, 19h43
  3. requette avec jointure et affichage redondant
    Par gilles974 dans le forum Requêtes
    Réponses: 26
    Dernier message: 25/10/2008, 12h35
  4. Problème de jointure pour affichage "speciale"
    Par webjeux dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/06/2006, 12h23
  5. Réponses: 5
    Dernier message: 04/05/2006, 15h38

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