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 SQL Discussion :

[MySQL 3.23.49] Recherche d'une question sans réponse dans un QCM


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut [MySQL 3.23.49] Recherche d'une question sans réponse dans un QCM
    Bonjour,

    J'ai modélisé un QCM avec entre autre les tables suivantes :

    'question' : ensemble des questions
    'choix' : choix de réponse possible à une question
    'reponse' : réponse effectuée par un utilisateur à une question
    'utilisateur' : table des utilisateurs

    Les relations sont les suivantes :
    • La table 'choix' possède le champ 'idquestion_rel' pour identifier la question correspondante.
    • La table 'reponse' possède les champ 'idchoix_rel' et 'idutilisateur_rel' pour identifier l'utilisateur ayant répondu avec son choix de réponse.


    J'essaie de créer une requête qui me renvoi les questions auxquelles l'utilisateur n'a pas encore répondu.
    Je bute sur le fait que je n'identifie pas la question directement dans la table des réponses. Si je rajoute le champ idquestion_rel dans la table 'reponse', je pense facilement arriver à faire ma requête par une jointure externe. Mais j'aimerai ne pas avoir à créer cette relation qui pour moi existe déjà par l'intermédiaire du champ 'idchoix_rel' puisqu'un choix correspond à une seule question.

    Petite précision je suis sous MySQL 3.23.49.

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    Avec la version 3 de MySql, tu ne peux pas faire de requête imbriquée, donc la solution avec un seul select n'est pas envisageable.

    Il faut donc faire plusieurs requêtes et filtrer les information dans le code de ton site web.

    Remarque : je ne vois pas en quoi le rajout du champ idquestion_rel dans la table 'reponse' peut t'aider.

    Peut tu fournir la requête que tu pense faire si tu rajoute ce champs

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut avec identifiacation de la question dans la table reponse
    Si la table 'reponse' a pour forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idreponse : idchoix_rel : idutilisateur_rel : idquestion_rel
    alors je pense que la requête suivante devrait donner les questions sans reponse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T1.* 
    FROM question AS T1 
    LEFT JOIN reponse AS T2 ON T1.idquestion=T2.idquestion_rel
    WHERE T2.idreponse IS NULL
    Ca devrait marcher non?

    On peut rajouter des conditions dans la clause where pour faire des filtres sur les réponses postées par un utilisateur particulier.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Points : 166
    Points
    166
    Par défaut
    Re,

    Avec cette requête tu trouvera les réponses auquelles aucun utilisateur n'a répondu, or d'après ce que tu dis, je comprends que tu cherche pour un utilisateur donné.

    Pour pouvoir faire ce que tu demandes en une seule requête, il faudrait que la table reponse contienne une ligne par question (il faut bien évidemment rajouter le champ idquestion_rel), et si l'utilisateur n'a pas répondu alors idchoix_rel sera null.

    Cette solution n'est pas très bonne car en cas d'ajout d'une question dans le QCM, il faut remettre à jour la table pour tous les utilisateurs.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    La requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * 
    FROM question AS T1 
    LEFT JOIN reponse AS T2 
    ON (T1.idquestion=T2.idquestion_rel AND T2.idutilisateur_rel=6) 
    WHERE T2.idreponse IS NULL
    me permet d'avoir les questions auquel l'utilisateur n°6 n'a pas répondu. J'ai fais quelques tests qui n'ont pas sembler mettre en exergue le cas que tu soulèves.

    J'ai créé des réponse pour d'autres utilisateur et ces nouveaux enregistrements ne sont pas venus poluer la requête. C'est peut être spécifique à MySQL?

    Je suis certain que quelqu'un de plus expérimenté que moi serait à même de faire en sorte que je n'ai pas besoin de rendre redondant l'information de la question en relation.

    Sinon je vais me résoudre à mettre dans la table 'reponse' à la fois l'identifiant du choix de réponse et celui de la question. Pourtant le choix est propre à une question...

    Je vais encore me gratter la tête cette nuit je pense...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par eternel7
    La requête suivante :
    me permet d'avoir les questions auquel l'utilisateur n°6 n'a pas répondu. J'ai fais quelques tests qui n'ont pas sembler mettre en exergue le cas que tu soulèves.
    Je suis assez étonné, je n'ai pas tester, mais pour moi voici un cas qui ne marche pas avec ta requête :

    l'utilisateur A à répondu à la question 1,
    l'utilisateur B à répondu à la question 1

    Pour l'utilisateur A, ta requête te retournera la question 1 alors qu'elle ne devrait pas y être.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Test
    Voici la structure et les données d'une base de test que je viens de créer :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    # phpMyAdmin MySQL-Dump
    # version 2.2.6
    # http://phpwizard.net/phpMyAdmin/
    # http://www.phpmyadmin.net/ (download page)
    #
    # Serveur: localhost
    # Généré le : Dimanche 03 Septembre 2006 à 09:28
    # Version du serveur: 3.23.49
    # Version de PHP: 4.2.0
    # Base de données: `test`
    # --------------------------------------------------------
     
    #
    # Structure de la table `choix`
    #
     
    CREATE TABLE choix (
      idchoix int(11) NOT NULL auto_increment,
      idquestion_rel int(11) NOT NULL default '0',
      libelle text NOT NULL,
      PRIMARY KEY  (idchoix)
    ) TYPE=MyISAM;
     
    #
    # Contenu de la table `choix`
    #
     
    INSERT INTO choix VALUES (1, 1, 'Première réponse possible question 1');
    INSERT INTO choix VALUES (2, 1, 'Deuxième réponse possible question 1');
    INSERT INTO choix VALUES (3, 2, 'Première réponse possible question 2');
    INSERT INTO choix VALUES (4, 2, 'Deuxième réponse possible question 2');
    INSERT INTO choix VALUES (5, 3, 'Première réponse possible question 3');
    INSERT INTO choix VALUES (6, 3, 'Deuxième réponse possible question 3');
    # --------------------------------------------------------
     
    #
    # Structure de la table `question`
    #
     
    CREATE TABLE question (
      idquestion int(11) NOT NULL auto_increment,
      libelle text NOT NULL,
      PRIMARY KEY  (idquestion)
    ) TYPE=MyISAM;
     
    #
    # Contenu de la table `question`
    #
     
    INSERT INTO question VALUES (1, 'Première question');
    INSERT INTO question VALUES (2, 'Deuxième question');
    INSERT INTO question VALUES (3, 'Troisième question');
    # --------------------------------------------------------
     
    #
    # Structure de la table `reponse`
    #
     
    CREATE TABLE reponse (
      idreponse int(11) NOT NULL auto_increment,
      idquestion_rel int(11) NOT NULL default '0',
      idchoix_rel int(11) NOT NULL default '0',
      idutilisateur_rel int(11) NOT NULL default '0',
      PRIMARY KEY  (idreponse),
      KEY idquestion_rel (idquestion_rel,idchoix_rel,idutilisateur_rel)
    ) TYPE=MyISAM;
     
    #
    # Contenu de la table `reponse`
    #
     
    INSERT INTO reponse VALUES (1, 1, 1, 1);
    INSERT INTO reponse VALUES (2, 1, 1, 2);
    INSERT INTO reponse VALUES (3, 2, 4, 2);
    # --------------------------------------------------------
     
    #
    # Structure de la table `utilisateur`
    #
     
    CREATE TABLE utilisateur (
      idutilisateur int(11) NOT NULL auto_increment,
      login varchar(25) NOT NULL default '',
      motdepasse varchar(25) NOT NULL default '',
      PRIMARY KEY  (idutilisateur),
      UNIQUE KEY login (login),
      FULLTEXT KEY login_2 (login)
    ) TYPE=MyISAM;
     
    #
    # Contenu de la table `utilisateur`
    #
     
    INSERT INTO utilisateur VALUES (1, 'A', 'dada');
    INSERT INTO utilisateur VALUES (2, 'B', 'dada');
    J'ai testé les requêtes suivantes :
    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
    SELECT * 
    FROM question AS T1 
    LEFT JOIN reponse AS T2 
    ON (T1.idquestion=T2.idquestion_rel AND T2.idutilisateur_rel=1) 
    WHERE T2.idreponse IS NULL
     
    La requête me donne les questions 2 et 3.
     
    SELECT * 
    FROM question AS T1 
    LEFT JOIN reponse AS T2 
    ON (T1.idquestion=T2.idquestion_rel AND T2.idutilisateur_rel=2) 
    WHERE T2.idreponse IS NULL
     
     
    La requête me donne la question 3
    Le tout me semble fonctionner correctement. Mais je n'aime pas le fait de devoir reprendre l'identifiant de la question dans la table 'reponse' alors que le champ 'idchoix_rel' identifie déjà une unique question correspondante par la table 'choix'.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 15
    Points : 13
    Points
    13
    Par défaut Solution à mon cas particulier
    Rebonjour,

    Je viens de me rendre compte que dans mon cas particulier je dois stocker le numéro de question au niveau de la réponse. En effet, une question peut prendre différente forme dans mon application :
    • choix unique par bouton radio
    • choix multiple par case à cocher
    • mot par champ de saisie
    • texte par champ bloc note (TEXTAREA)

    Pour les réponses de type mot et texte, il n'y a pas de choix associé et donc je dois stocker le numéro de question.

    Ainsi les requêtes de la discussion sont applicables.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/07/2009, 17h49
  2. Une question sur MySQL et l'arborescence
    Par santille dans le forum Langage
    Réponses: 5
    Dernier message: 05/06/2009, 20h31
  3. Réponses: 4
    Dernier message: 14/05/2009, 10h47
  4. Réponses: 3
    Dernier message: 02/03/2006, 09h49
  5. Réponses: 3
    Dernier message: 02/12/2005, 15h58

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