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

Langage PHP Discussion :

SQL avec multi tables avec champ identique et un autre champ au nom identique avec valeur differente


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut SQL avec multi tables avec champ identique et un autre champ au nom identique avec valeur differente
    Bonjour a tous,

    J'ai une question je pense plus compliquée a expliquer qu'a solutionner ..lol

    Je souhaite lire des valeurs une fois que 3 tables etaient jointes sur la base d'un champ de valeur unique ID. Mais j'ai besoin de lire le contenu du champ TEXT dont le contenu est different dans chaque table, mais qui porte le meme nom de champ.

    Détails :

    Table_1
    id = 1
    source = 1
    text =" toto vient lundi"

    Table_2
    id = 1
    source = 2
    text =" titi vient Mardi"

    Table_3
    id = 1
    source = 3
    text =" tutu vient Mercredi"

    Ma requete est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $res = mysql_query("SELECT * FROM `table_1` A, `table_2` B, `table_3` C where A.id=B.id and A.id=C.id order by A.id asc limit 20");
    Jusque la pas de soucis, sauf que j'ai besoin de lire le contenu de la variable 'text' pour chaque table différente un peu comme si on écrivait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    while($tl = mysql_fetch_array($res, MYSQL_ASSOC)){
    $id=$tl['id];
    $source=$tl['source];
    $valeur_du_champ_text_dans_la_table_1=$tl['table_1.text']; 
    $valeur_du_champ_text_dans_la_table_2=$tl['table_2.text'];
    $valeur_du_champ_text_dans_la_table_3=$tl['table_3.text'];
     
    if ($source=="1"){$texte = $valeur_du_champ_text_dans_la_table_1;}
    if ($source=="2"){$texte = $valeur_du_champ_text_dans_la_table_2;}
    if ($source=="3"){$texte = $valeur_du_champ_text_dans_la_table_3;}
     
    echo $texte;
    }
    Mais cela ne semble pas fonctionner !!!

    Auriez vous s'il vous plait une idée ?

    Merci a tous de m'avoir lu.
    Bonne fin de journée.
    Guillaume

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Hello Guillaume,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT A.id, A.text, B.text, C.text FROM `table_1` A, `table_2` B, `table_3` C where A.id=B.id and A.id=C.id order by A.id asc
    devrait fonctionner ?

    Par contre je en sais pas si appeler un champ : text est une bonne idée ... car text est peut-être un mot réservé ?

    Autre question ... est-ce que les 3 tables contiennent le même nombre d'enregistrements ou il y a des "trous"
    =>
    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
     
    ex : 
    Table_1
    id = 1
    source = 1
    text =" toto vient lundi"
     
    id = 250
    source = 1
    text =" Et alors ... vient lundi"
     
    Table_2
    id = 1
    source = 2
    text =" titi vient Mardi"
     
    id = 2
    source = 2
    text =" hop vient Mardi"
     
    Table_3
    id = 1
    source = 3
    text =" tutu vient Mercredi"
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Bonjour et merci pour cette réponse, mais je ne crois pas qu'elle solutionne mon problème, j'ai fais des tests et effectivement cela ne change rien.

    Le problème n'est pas la requête mais la lecture dans le while :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while($tl = mysql_fetch_array($res, MYSQL_ASSOC)){
    $id=$tl['id];
    $source=$tl['source];
    $valeur_du_champ_text_dans_la_table_1=$tl['table_1.text']; 
    $valeur_du_champ_text_dans_la_table_2=$tl['table_2.text'];
    $valeur_du_champ_text_dans_la_table_3=$tl['table_3.text'];
     
    if ($source=="1"){$texte = $valeur_du_champ_text_dans_la_table_1;}
    if ($source=="2"){$texte = $valeur_du_champ_text_dans_la_table_2;}
    if ($source=="3"){$texte = $valeur_du_champ_text_dans_la_table_3;}
     
    echo $texte;
    }
    Car j'ai besoin de lire le contenu de champ TEXT dans les 3 tables.

    Je peux modifier le nom TEXT par COMMENTAIRE mais cela ne change rien

    Non les tables contiennent des entrées aléatoires en terme de nombres.

    Merci pour vos autres idées.

    Guillaume

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    C'est quoi au fait la base de données ?

    Ok ... Reprenons cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM `table_1` A, `table_2` B, `table_3` C where A.id=B.id and A.id=C.id order by A.id asc
    Si on a uniquement les données ci dessous dans nos 3 tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Table_1
    id = 1;source = 1;text =" toto vient lundi"
    id = 250;source = 1;text =" Et alors ... vient lundi"
     
    Table_2
    id = 1;source = 2;text =" titi vient Mardi"
    id = 2;source = 2;text =" hop vient Mardi"
     
    Table_3
    id = 1;source = 3;text =" tutu vient Mercredi"
    =>
    on aura donc : 1 seule ligne avec la requête initiale dans la résultat (id=1)

    Donc je ne pense pas que ça soit le résultat attendu ?
    Pour avoir 3 lignes (id=1,id=2,id=250) il faudrait faire un union puis

    1) Traiter les "ruptures" d'id dans le while
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id = 1;source = 1;text =" toto vient lundi"
    id = 1;source = 2;text =" titi vient Mardi"
    id = 1;source = 3;text =" tutu vient Mercredi"
    ------------------------------------------------------
    id = 2;source = 2;text =" hop vient Mardi"
    ------------------------------------------------------
    id = 250;source = 1;text =" Et alors ... vient lundi"
    ou
    2) Faire ce genre de chose ... bon la syntaxe est à adapter ... c'est juste pour l'idée ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select idx, max(src1),max(text1),max(src2),max(text2),max(src3),max(text3) from 
    (
    SELECT id as idx, source as src1,text as text1, '' as src2, '' as text2, '' as src3, '' as text3   FROM `table_1`  
    union
    SELECT id as idx, '' as src1,'' as text1, source as src2, text as text2, '' as src3, '' as text3   FROM `table_2`  
    union
    SELECT id as idx, '' as src1,'' as text1, '' as src2, '' as text2, source as src3, text as text3   FROM `table_3`  
    )
    group by idx
    order by idx
    Autre remarque ... Pour la boucle while ci-dessous, il n'y a pas un champ source mais 3 : A.source, B.source, C.source
    donc là aussi il y a un soucis ... avec $tl['source] !?
    while($tl = mysql_fetch_array($res, MYSQL_ASSOC)){
    $id=$tl['id];
    $source=$tl['source];
    $valeur_du_champ_text_dans_la_table_1=$tl['table_1.text'];
    $valeur_du_champ_text_dans_la_table_2=$tl['table_2.text'];
    $valeur_du_champ_text_dans_la_table_3=$tl['table_3.text'];

    if ($source=="1"){$texte = $valeur_du_champ_text_dans_la_table_1;}
    if ($source=="2"){$texte = $valeur_du_champ_text_dans_la_table_2;}
    if ($source=="3"){$texte = $valeur_du_champ_text_dans_la_table_3;}

    echo $texte;
    Voili, voilou, maintenant peut-être que d'autres personnes sur ce forum auront
    d'autres idées ou des avis / réserves sur mes propositions mais
    du moment que ça progresse c'est le principal
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci encore VTTman de ton aide cependant cette requête renvoi l'erreur suivante :

    Erreur
    MySQL a répondu: Documentation
    #1054 - Unknown column 'idx' in 'field list'

    Peut être est ce une question de priorité dans la requête, puisque le premier select parle deja de idx avant de comprendre dans le select suivant que c'est un alias ?

    Bref ça a l'air compliqué ce que je veux faire

    Merci a tous ceux qui me lisent.
    Guillaume

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    et en remplaçant idx par id, ça donne quoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Select id, max(src1),max(text1),max(src2),max(text2),max(src3),max(text3) from 
    (
    SELECT id , source as src1,text as text1, '' as src2, '' as text2, '' as src3, '' as text3   FROM `table_1`  
    union
    SELECT id , '' as src1,'' as text1, source as src2, text as text2, '' as src3, '' as text3   FROM `table_2`  
    union
    SELECT id , '' as src1,'' as text1, '' as src2, '' as text2, source as src3, text as text3   FROM `table_3`  
    )
    group by id
    order by id
    Sinon id, source et text sont bien des champs de table_1, table_2, table_3 ?
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    653
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 653
    Points : 183
    Points
    183
    Par défaut
    Merci beaucoup pour ton aide vttman mais n'y parvenant pas j'ai préféré tout changer dans ma BDD avec une seule table reprenant toutes les infos.

    Merci également a tous ceux qui m'ont lu et evidemment un grand merci a toute l'aide qui m'a été apportée.

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

Discussions similaires

  1. [AC-2003] champ dépendant d'un autre champ dans une table
    Par josi1986 dans le forum Modélisation
    Réponses: 3
    Dernier message: 21/07/2011, 17h10
  2. [Table]champ calculé à partir des autres champs
    Par mjihanne dans le forum Access
    Réponses: 10
    Dernier message: 28/03/2007, 17h36
  3. Réponses: 2
    Dernier message: 06/02/2007, 09h17
  4. [SQL] INSERT multi-tables
    Par K_!!! dans le forum Oracle
    Réponses: 3
    Dernier message: 08/06/2006, 23h08
  5. Réponses: 6
    Dernier message: 29/05/2006, 19h43

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