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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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 éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

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

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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 averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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 éclairé
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    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 averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 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 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 134
    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'))
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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 averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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 averti
    Inscrit en
    Avril 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 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 Expert 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 : 38
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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 997
    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 997
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    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