Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写SQL子查询时出现问题_Sql_Mysql_Subquery - Fatal编程技术网

编写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

我知道我一定缺少了一些简单的东西……但我在编写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
我需要获取同时具有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;