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 :

Problème avec requete SQL


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Problème avec requete SQL
    Bonjour à tous

    J'ai un petit problème avec une fonctionnalité que j'essai de faire en SQL. Pour un formulaire de consultation en ligne, j'aimerais donné la possibilité à des usagers de faire une recherche parmi les réponses des autres utilisateurs.

    Pour ce faire j'ai la table:

    Réponse: ReponseID, QuestionID, RepondantID, Reponse

    J'aimerais pouvoir faire une requete du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select * 
    From Réponse
    Where ((QuestionID = 17 and Reponse = 'Reponse a la Q17') AND
               (QuestionID = 18 and Reponse = 'Reponse a la Q18'))
    Malheureusement, ce genre de requête ne fonctionne pas

    Est-ce que quelqu'un à déja eu ce problème et de quel façon le contourner!

    Merci d'avance,

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Peut être pas la meilleure réponse, mais avec une sous-requête ça ne marche pas ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    J'y ai pensé, mais je ne suis pas sur du comment la développer. Si tu as une petite idée la dessus ce serait apprécier

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Bonjour,
    premièrement si je peux me permettre, le fait d'appeler une table "Réponse" qui contient un champ qui s'appelle "Reponse" n'est pas très judicieux!
    Deuxièmement lorsque vous dites
    Malheureusement, ce genre de requête ne fonctionne pas
    expliquez un peu plus !!
    Enfin, je pense que la solution est effectivement une sous-requête en utilisant le IN.

    En espérant avoir aidé!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par baly5 Voir le message
    Bonjour,
    premièrement si je peux me permettre, le fait d'appeler une table "Réponse" qui contient un champ qui s'appelle "Reponse" n'est pas très judicieux!
    Oops j'avoue!!! je viens de constater l'erreur de jugement

    Citation Envoyé par baly5 Voir le message
    Deuxièmement lorsque vous dites expliquez un peu plus !!
    Enfin, je pense que la solution est effectivement une sous-requête en utilisant le IN.
    En espérant avoir aidé!
    Quand je dis ça ne marche pas j'entends
    "The Query Returned 0 Result"


    Pour la requête avec le IN ça ressemblerait à quoi?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select * From Reponses 
    Where ReponseID in (Select ReponseID From Reponses Where ???? = ????)
    Je suis probablement pas dans la bonne direction pour le IN car je me retrouverais avec la meme requête dans la sous-requete -_-'

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Comme suit conviendrai, mais vitre très très lourd si 20 questions et 20 tests !!!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * 
    FROM (SELECT * FROM Reponse WHERE QuestionID = 18 AND Reponse = 'Reponse a la Q18')
    WHERE QuestionID = 17 AND Reponse = 'Reponse a la Q17'
    L'ajout d'un AS serait également pas mal, en plus du changement pour éviter le doublon BASE, CHAMP

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Je pense que ça ressemblerait plus à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * 
    FROM Réponse
    WHERE QuestionID = 17 
    AND Reponse = 'Reponse a la Q17'
    AND ReponseID IN (SELECT ReponseID FROM Reponses WHERE QuestionID = 18 AND Reponse = 'Reponse a la Q18')
    A tester ...

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 105
    Points : 28 398
    Points
    28 398
    Par défaut
    Il est en effet difficile de trouver une quelconque ligne de la table Reponse dans laquelle la colonne QuestionID contienne simultanément les valeurs 17 et 18.
    Peut-être que OR résoudrait partiellement ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select * 
    From Réponse
    Where ((QuestionID = 17 and Reponse = 'Reponse a la Q17') 
    OR       (QuestionID = 18 and Reponse = 'Reponse a la Q18'))

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il est en effet difficile de trouver une quelconque ligne de la table Reponse dans laquelle la colonne QuestionID contienne simultanément les valeurs 17 et 18.
    Peut-être que OR résoudrait partiellement ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select * 
    From Réponse
    Where ((QuestionID = 17 and Reponse = 'Reponse a la Q17') 
    OR       (QuestionID = 18 and Reponse = 'Reponse a la Q18'))
    Ça je sais!

    Mais il faut vraiment que ce soit un and

    Car je veux trouver ceux qui ont la réponse X pour la question 17 ET la réponse Y pour la question 18

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par baly5 Voir le message
    Je pense que ça ressemblerait plus à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * 
    FROM Réponse
    WHERE QuestionID = 17 
    AND Reponse = 'Reponse a la Q17'
    AND ReponseID IN (SELECT ReponseID FROM Reponses WHERE QuestionID = 18 AND Reponse = 'Reponse a la Q18')
    A tester ...
    Sans succès, retourne 0 record

    Ce problème s'en vient vachement lourd O_O

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Je reviens sur la réponse de al1_24 qui est tout à fait juste.
    Peut-être que Winterrage devrait nous mettre un extrait de sa table "Réponse" pour que l'on comprenne mieux !

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Tel que Demandé voici un extrait de la table:

    Reponse ID | Question ID | Repondant ID | Reponse
    --------------------------------------------------
    1 16 1 Non
    2 17 1 Direction générale
    3 19 1 0 à 34999

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Donc telle que ta table est faite on ne trouvera jamais une ligne de la table qui possède telle réponse à la question 17 et telle réponse à la question 18 puisqu'il n'y a en fait qu'une question par ligne!!
    Tu ne peux pas trouver une ligne de ta table telle que QuestionID = 17 ET QuestionID = 18 !!
    Est-ce que je m'explique clairement?

    Peut-être qu'il faudrait revoir le schéma de la base!!

  14. #14
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Salut,
    tu nous donne ici un extrait de table qui ne correspond pas a ce que tu nous as donne comme exemple jusqu'a present.

    Reponse ID | Question ID | Repondant ID | Reponse
    --------------------------------------------------
    1 16 1 Non
    2 17 1 Direction générale
    3 19 1 0 à 34999
    Si tu veux recuperer ici les lignes correspondant aux questions 16 et 17 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM Reponse
    WHERE QuestionID = 16 OR QuestionID = 17
    Tu peux aussi utiliser les unions si tu preferes.

    Resultat :
    Reponse ID | Question ID | Repondant ID | Reponse
    --------------------------------------------------
    1 16 1 Non
    2 17 1 Direction générale
    Sinon ici tu nous marque Reponse = 'Reponse a la Q17', ca correpond a quoi exactement ? Le texte 'Reponse a la Q17' doit-il apparaitre ?
    SELECT *
    FROM Réponse
    WHERE ((QuestionID = 17 AND Reponse = 'Reponse a la Q17') AND
    (QuestionID = 18 AND Reponse = 'Reponse a la Q18'))
    Plus tu nous donnera de detail et plus ce sera facile de t'aider.

    Desolee pour le clavier qwerty

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    SELECT *
    FROM Réponse
    WHERE ((QuestionID = 17 AND Reponse = 'Reponse a la Q17') AND
    (QuestionID = 18 AND Reponse = 'Reponse a la Q18'))
    Signifie qu'à la QuestionID 17 la réponse doit etre 'Reponse a la Q17' et
    a la QuestionID 18 la réponse doit etre 'Reponse a la Q18'

    Ce qui permet d'appliquer certains filtre dans une recherche, comme par exemple, permettre de trouver ce qui à été saisie pour un cas semblable

    Par exemple, une requete complète serait:

    Quel système d'explotation est utilisé
    Dans le cas d'une ville de 0 à 34999 habitants
    ET qui possède leur propre corps de police

    --------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
    FROM Reponse
    WHERE QuestionID = 16 OR QuestionID = 17
    Je suis en train d'explorer cette piste. D'aller récupérer les questions et de trouver comment appliquer un filtre multiligne (tel ce qui à été énoncé plus haut)

    Merci de votre aide!

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 896
    Points : 53 130
    Points
    53 130
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- possible
    SELECT RepondantID 
    FROM   Réponse
    WHERE  QuestionID IN (17, 18)
     AND   Reponse IN ('Reponse a la Q17', 'Reponse a la Q18')
    GROUP  BY RepondantID 
    HAVING COUNT(*) = 2
    Mais attention car s'il y a inversion des questions et des réponses, alors problème !

    Une solution est de passser par un CROSS JOIN en valuant à 0 ou 1 les mauvaises et bonne réponse et faire une somme;

    a +

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- possible
    SELECT RepondantID 
    FROM   Réponse
    WHERE  QuestionID IN (17, 18)
     AND   Reponse IN ('Reponse a la Q17', 'Reponse a la Q18')
    GROUP  BY RepondantID 
    HAVING COUNT(*) = 2
    Mais attention car s'il y a inversion des questions et des réponses, alors problème !

    Une solution est de passser par un CROSS JOIN en valuant à 0 ou 1 les mauvaises et bonne réponse et faire une somme;

    a +
    Merci! C'est exactement ce que j'avais besoin

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

Discussions similaires

  1. probléme avec requete SQL
    Par sfrsky dans le forum Débuter
    Réponses: 4
    Dernier message: 17/05/2009, 12h27
  2. Problème avec requetes sql UPDATE
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 08/07/2008, 15h42
  3. Problème avec requete SQL/type NumAuto
    Par Mimisio dans le forum VBA Access
    Réponses: 5
    Dernier message: 27/07/2007, 11h56
  4. [ACCESS][SQL] Problème avec requete SQL ...
    Par mpascolo dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/11/2005, 10h54

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