我有两个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)=值“它是相反的,方法”在“不正确。
答案 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
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 :)