-1

我的表有 5 列(ID、UserId、问题和答案、WebEnabled)。

“UserId”是一个 FK,这个表实际上解决了多值属性问题。

这是示例数据:

Id  UserId  Question    Answer  WebEnabled
1   1   Q1              Ans1    1
2   1   Q2              Ans2    1
3   2   Q1              Ans1    1
4   2   Q4              Ans4    1
5   3   Q1              Ans1    1
6   3   Q3              Ans3    1
7   3   Q2              Ans2    0
8   4   Q5              Ans5    0

我需要使用 AND 运算符执行搜索功能。

例如,用户从 Web 下拉列表中输入 Q1 和 Q2 将需要返回在 Questions 中具有 Q1 和 Q2 的所有 userId。

请帮忙。

编辑:

Q1、Q2 可以是任意数量的参数(比如 Q1、Q2、Q3、Q4),查询应该使用所有这些参数并返回用户 ID。

4

3 回答 3

1

您可以使用 PIVOT 运算符在数据上创建数据透视,从而导致 Q1、Q2、Q3、... Q5 显示为列,每次用户回答该问题时,每个列下方都有一个计数。然后使用过滤器 Q1 和 Q2 = 1 从透视集中查询。您可以在此处运行以下示例:http ://sqlfiddle.com/#!3/6a31d/8

WITH UserQuestionsPivot AS
(
SELECT
  UserId,
  Q1,Q2,Q3,Q4,Q5
FROM 
(
SELECT
  UserId,
  1 AS Answered,
  Question
FROM UserQuestions
) AS SourceTable
PIVOT
(
  SUM(Answered)
  FOR Question IN ([Q1], [Q2], [Q3], [Q4], [Q5])
) AS PivotTable
)
SELECT
  *
FROM UserQuestionsPivot
WHERE Q1 = 1 AND Q2 = 1
于 2012-12-12T04:29:31.723 回答
1

我不太明白你的问题。下面的陈述将得到您所要求的答案,但似乎这可能不是您想要的?

SELECT DISTINCT UserId
FROM   Table
WHERE  Question='Q1'
       OR
       Question='Q2'
于 2012-12-12T04:14:20.133 回答
1

将问题组合成一个字符串,用逗号分隔,并确保值不重复,如下所示:

DECLARE @SearchString VARCHAR(100);
DECLARE @NumberOfValues INT;
Set @SearchString = 'Q1,Q2,Q3,Q4';
Set @NumberOfValues = 4;

然后运行这个简单的 SQL 语句:

SELECT Table1.* FROM 
Table1, (SELECT UserId, Count(DISTINCT Question) Cnt 
         From Table1 
         WHERE @SearchString LIKE '%' + RTRIM(Question) + '%' 
         GROUP BY UserID 
         HAVING Count(DISTINCT Question) = @NumberOfValues) AS T
WHERE Table1.UserId = T.UserId
于 2012-12-12T04:14:22.977 回答