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 SQL selectionner l'id d'une table sans clef commune [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut Requête SQL selectionner l'id d'une table sans clef commune
    Bonjour,

    Voici mon petit souci:
    J'ai trois tables, A B et C.
    -La clef étrangère entre A et B est idDef.
    -La clef étrangère entre B et C est idCom.

    Il n'y a pas de liens direct entre A et C.

    Maintenant je dois faire un update dans la table A, à partir d'une variable correspond à idCom qui est donc la clef étrangère entre B et C. Vous me suivez ?

    Bien sur je peux d'abord faire une requête SQL pour récupérer l'id de A dont idDef se trouve être dans la table B liée à C depuis idCom. Mais cela fait une requête de plus, c'est dommage.

    J'ai donc essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $update="UPDATE  `definitions` SET nbrCommentaire=nbrCommentaire+1,titre='".$titre."', date='".$date."' WHERE id=(SELECT id FROM `definitions`WHERE definitions.id=commentaire.idDef AND commentaire.id='".$idCom."')";
    Comme vous pouvez le deviner, cela fonctionne à merveille.

    Avez-vous mieux, à tout hasard ... ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Bon je viens d'essayer cela aussi, mais ça ne fonctionne pas non plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $update="UPDATE  `definitions` SET nbrCommentaire=nbrCommentaire+1,titre='".$titre."', dateDernierSousCom='".$date."' WHERE definitions.id=commentaire.idDef AND commentaire.id='".$commentaire."'

  3. #3
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut Re: requête SQL selectionner l'id d'une table sans clef comm
    Citation Envoyé par psychoBob
    Bonjour,

    J'ai donc essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $update="UPDATE  `definitions` SET nbrCommentaire=nbrCommentaire+1,titre='".$titre."', date='".$date."' WHERE id=(SELECT id FROM `definitions`WHERE definitions.id=commentaire.idDef AND commentaire.id='".$idCom."')";
    Comme vous pouvez le deviner, cela fonctionne à merveille.
    C'est quoi le message d'erreur de mysql ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Non je n'ai pas de message d'erreur, simplement ça n'update pas.

    Je n'ai pas placé le mysql_error()) mais normalement si ça buggait je le verrais, non ?

    **edit**

    Bon je viens de réessayer cela, en faisant plus attention à la logique de la requête, ça n'update pas, mais est-ce qu'au moins la syntaxe est correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $update="UPDATE  `definitions` SET nbrCommentaire=nbrCommentaire+1,titre='".$titre."', dateDernierSousCom='".$date."' WHERE id=(SELECT idDef FROM `commentaire`WHERE commentaire.id='".$commentaire."')"

  5. #5
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Citation Envoyé par psychoBob
    **edit**

    Bon je viens de réessayer cela, en faisant plus attention à la logique de la requête, ça n'update pas, mais est-ce qu'au moins la syntaxe est correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $update="UPDATE  `definitions` SET nbrCommentaire=nbrCommentaire+1,titre='".$titre."', dateDernierSousCom='".$date."' WHERE id=(SELECT idDef FROM `commentaire`WHERE commentaire.id='".$commentaire."')"
    Justement c'est ce que je regardais.


    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
     
    UPDATE  
    	definitions 
    SET 
    	nbrCommentaire=nbrCommentaire+1,
    	titre='$titre',
    	date='$date' 
    WHERE 
    	id = (
    			SELECT 
    				id 
    			FROM 
    				definitions 
    			WHERE 
    				definitions.id=commentaire.idDef 
    			AND 
    				commentaire.id='$idCom'
    		)
    Je pige pas bien ceque tu essaiesde faire ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    				id 
    			FROM 
    				definitions 
    			WHERE 
    				definitions.id=commentaire.idDef 
    			AND 
    				commentaire.id='$idCom'
    SELECT id,de quel table ?
    WHERE commentaire.id, mais iln'est pas déclaré dans le FROM :s

    En plus si jamais tu as plus d'un tuple, ou ligne, qui est renvoyé par ce SELECT tu vas te manger un bo message d'erreur.

    Pour éviter cela tu devras utiliser la syntaxesuivante WHERE matable.id IN(SELECT...) au lien de WHERE id=(SELECT..)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Bon alors, j'ai fait cela, ça fonctionne, mais le but est toujours d'essayer de le faire en une seule requête :

    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
    //on va chercher dans la base le titre et l'idDef du commentaire (table B) dont l'identifiant correspond à la clef étrangère entre B et C qui correspond à $commentaire.
    L'idDef ainsi récupéré dans la table B est la clef étrangère entre A et B.
     
    $verif="SELECT idDef,titre FROM commentaire WHERE  id='".$commentaire."'";
    $resultat = mysql_query("$verif");
    while ($R = mysql_fetch_array($resultat)) {
    $idDef=$R[idDef];
    $idDef=$R[titre];
     
    //maintenant que l'on a idDef, on va savoir savoir quel tuple de la table A nous devons updater
     
    $update="UPDATE  `definitions` SET nbrSousCommentaire=nbrSousCommentaire+1,titre='".$titre."', dateDernierSousCom='".$date."' WHERE id='".$idDef."'"; 
    mysql_query($update); 
    }//ferme le SELECT idDef pour trouver l'idDef et updater la table definition
    mysql_free_result($resultat)
    Donc cela fonctionne (à l'exception du champ nbrSousCommentaire, allez savoir pourquoi...) mais peut être saurez-vous régler cela en une seule requête ?

  7. #7
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    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
    "
    UPDATE  
    	definitions D
    SET 
    	D.nbrSousCommentaire = D.nbrSousCommentaire+1,
    	D.titre='".$titre."', 
    	D.dateDernierSousCom='".$date."' 
    WHERE 
    	D.id= (	SELECT 
    				C.idDef,
    				C.titre 
    			FROM 
    				commentaire C
    			WHERE  
    				C.id='".$commentaire."'
    	 )
    ";
    qu'en penses tu ?

    Par contre je sait pas trop si tu sors $commentaire,$titre et $date d'un endroit autre ou si c'était à rechercher avec la requete.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    J'essais mais je sens déjà que ça va bugger : tu as vérifié la syntaxe pour que cela fonctionne tel quel ou bien c'est juste une idée ? Parce que tes D me semblent un peu hasardeux, non ? En tout cas je ne comprend pas trop la raison de leur présence.

  9. #9
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    C'est un alias.

    SELECT ... FROM [matable] As [myAlias] ou SELECT ... FROM [matable] [myAlias]

    Et après tu fais WHERE [MyAlis].[Monchamps] ect

    Qd à la raison c'est juste que je suis faineant et que sa me soul de réécrire definition.id,definition.titre ect

  10. #10
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    et oui y 'à une erreur qui trainait dans le select.

    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
    " 
    UPDATE  
       definitions D 
    SET 
       D.nbrSousCommentaire = D.nbrSousCommentaire+1, 
       D.titre='".$titre."', 
       D.dateDernierSousCom='".$date."' 
    WHERE 
       D.id= (   SELECT 
                C.idDef
             FROM 
                commentaire C 
             WHERE  
                C.id='".$commentaire."' 
        ) 
    ";

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Bon je viens d'essayer ça, tel quel, ça ne fonctionne pas :

    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
    $update=" 
       definitions
    SET
       nbrSousCommentaire = nbrSousCommentaire+1,
      titre='".$titre."',
    dateDernierSousCom='".$date."'
    WHERE
     id= (   SELECT
                idDef,
               titre
             FROM
                commentaire 
             WHERE 
                id='".$commentaire."'
        )
    "; 
    mysql_query($update);

    Tu rajouterais systématiquement le nom des tables devant celui des champs toi, EpoX ?

  12. #12
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Tu rajouterais systématiquement le nom des tables devant celui des champs toi, EpoX ?
    Oui c'est plus clair, pour moi en tout cas, et sa évite les ambiguité dans la requete.

    Pour l'erreur regarde dans mon post au dessus.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Bon je viens de réessayer cela, texto copier coller, mais ça n'update pas :

    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
    $update=" 
       definitions
    SET
      definitions.nbrSousCommentaire = definitions.nbrSousCommentaire+1,
      definitions.titreDernierMessage='".$titre."',
    definitions.dateDernierSousCom='".$date."'
    WHERE
     definitions.id= (   SELECT
                commentaire.idDef,
              FROM
                commentaire 
             WHERE 
                commentaire.id='".$commentaire."'
        )
    "; 
    mysql_query($update);

    Pour l'alias, normalement, on note table AS [alias] non ?

  14. #14
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    j'ai créé deux tablespour faire le test

    definition
    - id
    - nbrSousCommentaire
    - titre
    - dateDernierSousCom

    commentaire
    - id
    - titre
    - idDef

    Et sa fonctionne si commentaire possède une clef équivalente dans definition.

    :/

    Tu n'as pas une erreur autre part ?

  15. #15
    Membre Expert
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Par défaut
    Salut, peut-être en enlevant les ' dans la clause WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commentaire.id='".$commentaire."'
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commentaire.id=".$commentaire."
    :

  16. #16
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Peux tu faire un echo de ta requete avant le mysql_query ?

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Merci pour votre aide les gars, mais ça ne fonctionne toujours pas.

    je viens de réessayer cela :
    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
     
    $update=" 
       definitions
    SET
     
      titreDernierMessage='".$titre."',
     
    WHERE
    id= (   SELECT
               idDef
              FROM
                commentaire 
             WHERE 
               id='".$commentaire."'
        )
    "; 
    mysql_query($update);
    Je continue les essais,parce que ça semble cohérent et EpoX dit que chez lui ça fonctionne...

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 221
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 221
    Par défaut
    Un echo de ma requête ? que veux tu dire EpoX ?

    En tout cas je n'ai pas de message d'erreur, je viens de verifier dans le code source (même si je n'ai pas placé mysql_error()) mais normalement un message d'erreur s'afficherait quand même)

  19. #19
    Membre Expert
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Par défaut
    Pas pour un message d'erreur juste pour voir ce que tu envoies avant de l'executer et puis après aller voir dans ta bdd pour regarder pourquoi sa ne fonctionne pas.

    accessoirement parceque j'aurais voulu voir

  20. #20
    Membre Expert
    Avatar de Nesmontou
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Septembre 2004
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 612
    Par défaut
    Euh, tu as essayé ce que j'avais proposé :

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] Requête Ajoût avec donnée d'une table, sans passer par le SQL
    Par charlhub dans le forum Access
    Réponses: 4
    Dernier message: 08/01/2012, 19h49
  2. Réponses: 1
    Dernier message: 07/12/2009, 09h25
  3. [Requête/SQL] Compléter les champs d'une table
    Par arn.oo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/04/2007, 13h57
  4. [Requête/SQL]Importer des données d'une table à l'autre
    Par atlantideD dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/04/2007, 10h46

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