SELECT * FROM问题WHERE test_id

时间:2015-06-04 21:08:25

标签: mysql sql arrays

我有两个SQL表:

测试

Dim cell As Range
For Each cell In Range("A3:A2000")

    If (Worksheets("n1").Range("AT" & cell.Row - 1) = _
        Application.WorksheetFunction.VLookup(Range(AT & cell.Row - 1), _
        Worksheets("p1").Range("A1:E55000"), 5, False)) Or _
        (Worksheets("n1").Range("AT" & cell.Row - 1) = "N/A") Then

        [Do something]

    Else

        [do something else]

    End If

Next cell

问题

id | name
1  | simple
2  | advanced
3  | professional

只有在“test_id”中是所需测试的id时才应显示问题,例如,测试2应仅包含问题2和3

id | Question                    | answer a | answer b | test_id
1  | Working?                    | Yes      | no       | 1,3
2  | Do you smoke?               | Yes      | no       | 2,3
3  | You have a driving license? | Yes      | No       | 2

它不重复,因为在建议的问题是查询,如“WHERE ... value =(1,2,3,4)”,但在我的问题,我有查询像“... WHERE(1 ,2,3,4,5)=值“它是相反的,方法”在“不正确。

4 个答案:

答案 0 :(得分:6)

你应该normalize你的数据库,创建第三个表来将问题与它们出现的测试联系起来:

<强>试验:

id | name
1  | simple
2  | advanced
3  | professional

<强>问题:

id | question                    | answer a | answer b
1  | Working?                    | Yes      | No
2  | Do you smoke?               | Yes      | No
3  | You have a driving license? | Yes      | No

<强> TestQuestions:

id | test_id | question_number | question_id
1  | 1       | 1               | 1
2  | 2       | 1               | 2
3  | 2       | 2               | 3
4  | 3       | 1               | 1
5  | 3       | 2               | 2

然后,您可以通过将问题:

加入TestQuestions表来获取单个测试的问题
    SELECT Questions.*
      FROM TestQuestions
INNER JOIN Questions ON Questions.id = TestQuestions.question_id
     WHERE TestQuestions.test_id = 2
  ORDER BY TestQuestions.question_number

如果您无法修改数据库表,那么您还可以使用MySQL FIND_IN_SET函数确定测试中的问题:

SELECT * From Questions WHERE FIND_IN_SET('2', test_id) > 0

最好使用规范化的数据库结构,因为这样可以表达测试中的问题排序,也可以创建索引以提高性能。

要评估FIND_IN_SET查询,数据库必须考虑Questions表中的每一行以查看它是否匹配。通过将以下索引添加到规范化数据库,数据库将能够直接寻找相关问题进行测试:

CREATE UNIQUE INDEX test_id_question_number ON TestQuestions (test_id, question_number)

答案 1 :(得分:0)

您确实应该包含另一个将问题映射到测试的表格。你现在的方式,问题不能轻易地与测试相关联。例如,如果你尝试使用LIKE比较,你可能会得到你不想要的问题。假设您正在寻找测试2的问题

SELECT * FROM questions WHERE test_id LIKE %2%;

您还可以检索测试项目12,20s和32,42等任何项目

您应该创建一个名为testquestions的新表(例如)。这将有两个字段

  • 为test_id
  • question_id

然后是这些数据(使用上面显示的内容)

test_id  |  question_id
1        |  1
2        |  2
2        |  3
3        |  1
3        |  2

现在您可以运行像这样的查询

SELECT 
  tests.name,
  questions.question,
  questions.`answer a`,
  questions.`answer b`
FROM (
  tests LEFT JOIN testquestions ON test.id=testquestion.test_id 
) LEFT JOIN
questions ON questions.id = testquestion.question_id 
WHERE 
  tests.id = 2; 

答案 2 :(得分:0)

如果您需要一次搜索一个测试ID,可以使用

SELECT * FROM questions WHERE (',' + test_id + ',') like '%,1,%' 

答案 3 :(得分:0)

我认为最好的解决方案为你提供菲尔罗斯(只考虑我会改变将存储这个是/否答案为真/假或小int和0/1)...但是如果你想保持你的桌子就像他们一样,你可以做这样的事情

SELECT q.* FROM Questions q
INNER JOIN tests t
ON t.id = 2 
AND q.test_id regexp(CONCAT('(^|,)',t.id, '(,|$)'));

以下是SQL Fiddle,了解它是如何运作的......

P.S。查询连接和第一个表,以便您可以从那里选择值...

GL!

编辑:菲尔建议修正...... Tnx Phil :)