Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Sql Server - Fatal编程技术网

Sql 多行仅获取特定值

Sql 多行仅获取特定值,sql,sql-server,Sql,Sql Server,感觉这应该是一个相当简单的问题,但我正在努力找到解决办法 我们有三个表来创建问答系统。一个是问题,另一个是答案,然后第三个是最终存储用户选择的位置 问题表 QuestionID Question 1 What is your favorite color? 2 Where were you born? 答题台 AnswerID QuestionID Answer 1 1 Blue 2 1 Gr

感觉这应该是一个相当简单的问题,但我正在努力找到解决办法

我们有三个表来创建问答系统。一个是问题,另一个是答案,然后第三个是最终存储用户选择的位置

问题表

QuestionID Question 
1          What is your favorite color?
2          Where were you born?
答题台

AnswerID QuestionID Answer
1        1          Blue
2        1          Green
3        1          Yellow
4        2          USA
5        2          Africa
应答存储表

AnswerStoreID QuestionID AnswerID UserID
1             1          1        1
2             1          2        1
3             2          4        2
4             2          5        2
5             1          1        3
我想找到回答问题ID 1的用户ID为AnswerID 1,回答问题ID 2的用户ID为AnswerID 4

我觉得这很简单

SELECT UserID
FROM Question Q
INNER JOIN Answer A ON A.QuestionID = A.QuestionID
INNER JOIN AnswerStore AS ON AS.AnswerID = A.AnswerID
WHERE (AS.AnswerID = 1 AND AS.QuestionID = 1)
AND (AS.AnswerID = 2 AND AS.QuestionID = 4)
但这并不意味着什么。当用
替换两个where语句之间的
时,会得到两个答案都没有的结果,尽管这也是不需要的。我只想要那些回答了这两个问题的用户

然后,我用一些不同的连接进行了一个查询,以对每个问题进行查询,但我觉得这对于这个问题来说太复杂和沉重了,我想得太多了。这个问题有更简单的解决方法吗?

--Edit----

实际上,在原始查询中甚至不需要连接:

SELECT t.UserID
FROM AnswerStore AS t
WHERE (t.AnswerID = 1 AND t.QuestionID = 1)
   OR (t.AnswerID = 2 AND t.QuestionID = 4)
GROUP BY t.UserID
HAVING COUNT(*) = 2
----原始完整答案----

这实际上是一个相当常见的问题,每周出现几次。不幸的是,很难制定一个可重复/可搜索的问题作为参考

SELECT UserID
FROM Question Q
INNER JOIN Answer A ON A.QuestionID = A.QuestionID
INNER JOIN AnswerStore AS ON AS.AnswerID = A.AnswerID
WHERE (AS.AnswerID = 1 AND AS.QuestionID = 1)
   OR (AS.AnswerID = 2 AND AS.QuestionID = 4)
GROUP BY UserID
HAVING COUNT(*) = 2
一般形式为:

SELECT A.a_id
FROM A
INNER JOIN B ON A.a_id = B.a_id
WHERE B.something IN ([list])
GROUP BY a_id
HAVING COUNT(*) = [length of list]
-- or in cases where B matches may be non-unique
-- HAVING COUNT(DISTINCT B.something) = [length of list] 
----编辑----

实际上,在原始查询中甚至不需要连接:

SELECT t.UserID
FROM AnswerStore AS t
WHERE (t.AnswerID = 1 AND t.QuestionID = 1)
   OR (t.AnswerID = 2 AND t.QuestionID = 4)
GROUP BY t.UserID
HAVING COUNT(*) = 2
----原始完整答案----

这实际上是一个相当常见的问题,每周出现几次。不幸的是,很难制定一个可重复/可搜索的问题作为参考

SELECT UserID
FROM Question Q
INNER JOIN Answer A ON A.QuestionID = A.QuestionID
INNER JOIN AnswerStore AS ON AS.AnswerID = A.AnswerID
WHERE (AS.AnswerID = 1 AND AS.QuestionID = 1)
   OR (AS.AnswerID = 2 AND AS.QuestionID = 4)
GROUP BY UserID
HAVING COUNT(*) = 2
一般形式为:

SELECT A.a_id
FROM A
INNER JOIN B ON A.a_id = B.a_id
WHERE B.something IN ([list])
GROUP BY a_id
HAVING COUNT(*) = [length of list]
-- or in cases where B matches may be non-unique
-- HAVING COUNT(DISTINCT B.something) = [length of list] 

您实际上看到了两组数据,回答问题ID 1的用户ID为AnswerID 1,回答问题ID 2的用户ID为AnswerID 4。因此,您可以将这些集合连接在一起,以查找两组数据中的用户标识:

SELECT UserID
FROM AnswerStore as1 INNER JOIN AnswerStore as2 ON as1.UserID = as2.UserID
AND as1.QuestionID = 1 AND as1.AnswerID = 1
AND as2.QuestionID = 2 AND as2.AnswerID = 4

您实际上看到了两组数据,回答问题ID 1的用户ID为AnswerID 1,回答问题ID 2的用户ID为AnswerID 4。因此,您可以将这些集合连接在一起,以查找两组数据中的用户标识:

SELECT UserID
FROM AnswerStore as1 INNER JOIN AnswerStore as2 ON as1.UserID = as2.UserID
AND as1.QuestionID = 1 AND as1.AnswerID = 1
AND as2.QuestionID = 2 AND as2.AnswerID = 4

将AND更改为OR。不能有一行同时具有两组值。请参阅我的说明的最后一部分。这将产生两个答案集都没有答案的关系fwiw,您的示例不包含您正在寻找的值。用户ID 1满足第一个条件,但第二个条件仅由用户ID 3满足。用户1满足我们希望查询拉取的条件。用户3不会这样做。因此问题就来了。我们只希望用户1出现。然而,如果我们像你建议的那样做一个“或”,我们将得到用户1和用户3。编辑:现在明白你的意思了。我调整了采样以满足我刚才描述的要求。谢谢将AND更改为OR。不能有一行同时具有两组值。请参阅我的说明的最后一部分。这将产生两个答案集都没有答案的关系fwiw,您的示例不包含您正在寻找的值。用户ID 1满足第一个条件,但第二个条件仅由用户ID 3满足。用户1满足我们希望查询拉取的条件。用户3不会这样做。因此问题就来了。我们只希望用户1出现。然而,如果我们像你建议的那样做一个“或”,我们将得到用户1和用户3。编辑:现在明白你的意思了。我调整了采样以满足我刚才描述的要求。谢谢