2010-07-28 2 views
0

Je sais que je dois manquer quelque chose de simple ici ... mais j'ai des problèmes avec l'écriture d'une sous-requête SQL. Compte tenu des données suivantesProblème avec l'écriture d'une sous-requête SQL

user_id question_id answer_text 
89   1   value1 
89   2   value2 
80   2   value2 
99   2   value2 
96   1   value1 
96   2   value2 
111  1   value1 
111  2   value2 

Je dois obtenir les user_id de qui ont tous deux question_id 1 = « value1 » et ont question_id 2 = « valeur2 »

Les résultats ci-dessus sont générés en utilisant cette requête:

SELECT `User_answer`.`user_id`, `User_answer`.`question_id`, `User_answer`.`answer_text` FROM `user_answers` AS `User_answer` WHERE `User_answer`.`question_id` IN (1, 2) AND `User_answer`.`answer_text` IN ('value1', 'value2') 

mais bien sûr cela renvoie les utilisateurs qui ont répondu à la question 1 avec "value1" mais la question 2 avec une réponse complètement différente de "value2" (et vice versa).

Je dois pouvoir ajouter plus de conditions mais je pense que je peux ajouter que si je peux obtenir au moins ces deux fonctionnant.

Répondre

0

Une méthode consiste à utiliser une jointure réflexive, par exemple

select a1.user_id, a1.answer_text AS Answer1, a2.answer_text AS Answer2 
from user_answers a1 join user_answers a2 on a1.userid=a2.userid and a1.question_id=1  and a2.question_id=2 
where a1.answer_text <> a2.answer_text 

désolé si la syntaxe est un peu hors (Il a été un moment que je MySQL), mais vous voyez l'idée.

0

Je le faire en utilisant une jointure interne comme ceci:

SELECT 
    user_id 
FROM 
    user_answers AS a1 
    INNER JOIN user_answers AS a2 ON 
    a2.user_id = a1.user_id 
    AND a2.question_id=2 
    AND a2.answer_text='value2' 
WHERE 
    a1.question_id=1 
    AND a1.answer_text='value1' 

traduit:

  1. Trouver toutes les réponses avec un question_id de 1 et answer_text de 'valeur1'
  2. Pour ces réponses, trouver les réponses correspondantes avec le même identifiant utilisateur et question_id de 2 et answer_text de 'value2'.
  3. Faire une jointure interne, c'est-à-dire jeter ceux qui ne satisfont pas les deux.
0

Je vais essayer de le faire sans sous-requête, comme ceci:

SELECT `User_answer`.`user_id`, 
    MAX(CASE `User_answer`.`question_id` WHEN 1 THEN `User_answer`.`answer_text` END) AS `q1_answer`, 
    MAX(CASE `User_answer`.`question_id` WHEN 2 THEN `User_answer`.`answer_text` END) AS `q2_answer` 
FROM `user_answers` AS `User_answer` 
WHERE (`User_answer`.`question_id` = 1 AND `User_answer`.`answer_text` = 'value1') 
    OR (`User_answer`.`question_id` = 2 AND `User_answer`.`answer_text` = 'value2') 
GROUP BY `User_answer`.`user_id` 
HAVING COUNT(DISTINCT `User_answer`.`question_id`) = 2;