【发布时间】:2012-04-07 15:36:33
【问题描述】:
我需要一些有关 SQL 语法的帮助。
假设我有一个成员表、一个问题表和一个答案表,这些表的基本内容如下:
成员表:
memberId: primary key
问题表:
questionId: primary key,
questionText:varchar
答案表:
answerId: primary key,
questionId: int (relating to the row of the question in the questions table)
memberId: int (relating to the row of the member in the members table)
answerValue:varchar
表格会有更多的列,但为了解决这个问题,这些应该就足够了。
现在,在某些情况下,我希望运行一个查询,该查询将返回一个不同的成员 ID 列表,其中成员对问题列表的回答与某个值匹配。
例如:
假设问题表(第 1 行)中有一个问题,问题文本为:“你喜欢猫还是狗?”:
questionId questionText
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 Do you like cats or dogs?
那么members表从id 1到10有10个成员,在answers表中有对应的答案:
answerid questionId memberId answerId
---------------------------------------------------------------------------------------
1 1 1 cats
2 1 2 both
3 1 3 cats
4 1 4 cats
5 1 5 cats
6 1 6 dogs
7 1 7 dogs
8 1 8 dogs
9 1 9 dogs
10 1 10 both
这样查询就很简单了,例如回答狗的人:
SELECT DISTINCT memberId FROM members INNER JOIN answers ON members.memberId = answers.answerId WHERE answers.questionId = 1 AND answers.answerValue = 'dogs'
这将返回:
memberId
---------------
6
7
8
9
但是如果我要在问题表中添加另一个问题呢:
questionId questionText
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 Do you like cats or dogs?
2 What is your favourite color?
答案表更新如下:
answerid questionId memberId answerId
---------------------------------------------------------------------------------------
1 1 1 cats
2 1 2 both
3 1 3 cats
4 1 4 cats
5 1 5 cats
6 1 6 dogs
7 1 7 dogs
8 1 8 dogs
9 1 9 dogs
10 1 10 both
11 2 1 blue
12 2 2 red
13 2 3 green
14 2 5 green
15 2 4 black
16 2 6 violet
17 2 7 pink
18 2 8 green
19 2 9 red
20 2 10 yellow
如何查询多个问题?
我正在寻找的是一种集合语法,可用于查询已回答任意数量问题的特定答案的不同成员列表,例如:
对于喜欢 ((dogs AND red) OR (cats AND green)) 的成员的查询应该返回:
memberId
-----------------
9
3
5
答案可能有任意组合。它的本质是如何查询一个内连接表的多个值?
感谢任何人提供的任何帮助,如果有点混乱,请见谅。
【问题讨论】:
-
这有点难以解释在现实世界中的实现,但我已经尝试过了,基本上我设计了一个电子邮件引擎,它接受一个条件列表,例如(动物 = 猫和颜色 = 绿色(当然非常简化))并通过生成 sql 查询来查询数据库中匹配这些条件的成员,然后将电子邮件发送到返回的 id。
-
就给出的示例而言,我已经尝试 SELECT DISTINCT memberId FROM members INNER JOIN answers ON members.memberId = answers.answerId WHERE (((answers.questionId = 1 AND answers.answerValue = 'dogs' ) AND (answers.questionId = 2 AND answers.answerValue = 'red')) OR ((answers.questionId = 1 AND answers.answerValue = 'cats') AND (answers.questionId = 2 AND answers.answerValue = 'green' )))
-
我看不出你在这里问什么。您在上面的评论中的加入查询甚至没有意义。为什么要加入 memberid=answerid?
-
我至少努力为您构建一个 sqlfiddle。 sqlfiddle.com/#!3/ae8d3/1
标签: sql sql-server join conditional-statements