编写SQL子查询时出现问题
我知道我一定缺少了一些简单的东西……但我在编写SQL子查询时遇到了问题。鉴于以下数据编写SQL子查询时出现问题,sql,mysql,subquery,Sql,Mysql,Subquery,我知道我一定缺少了一些简单的东西……但我在编写SQL子查询时遇到了问题。鉴于以下数据 user_id question_id answer_text 89 1 value1 89 2 value2 80 2 value2 99 2 value2 96 1 value1 96 2
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
我需要获取同时具有question_id 1='value1'和question_id 2='value2'的用户
以上结果是使用此查询生成的:
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')
但当然,这会返回回答问题1的用户的值为1,而回答问题2的用户的值与回答问题2的值完全不同,反之亦然
我需要能够添加更多的条件,但我想我可以添加,如果我至少可以让这两个工作。一种方法是使用自连接,例如
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
抱歉,如果语法有点不正确,我已经有一段时间没有使用MySQL了,但是你明白了 我会使用这样的内部联接来完成此操作:
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'
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;
翻译为:
查找问题id为1且答案文本为“value1”的所有答案
对于这些答案,请查找具有相同用户id和问题id为2以及答案文本为“value2”的相应答案。
把两者都不满意的东西扔掉。
我会尝试在不使用子查询的情况下执行此操作,如下所示:
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'
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;