我有一个只包含几个表的数据库,这些表是根据通过不断变化的表单内容提交的值填充的,这些表包含很多复选框,广播,选择列表变量等等。
表单的每个元素都附有一个唯一的ID,如Q1,Q2,Q3等......无论用户检查什么信息,都会添加到数据库中。
插入信息的“提交”表如下所示:
doc_id ques ans other final
1 Q1 1 blah 1
1 Q2 5 1
1 Q2 6 1
3 Q3 1 blah
4 Q4 8
1 Q6 1375228800 1
如果用户希望获得Q1设置为1且Q2设置为5的所有文档,则它可以正常工作,但是当指定日期时它不起作用。
搜索条件可以随时更改,除了尝试按时间戳过滤结果外,它主要工作,例如“ans”字段显示Unix时间戳“1375228800”
以下是一个例子:
SELECT doc_id FROM submission
WHERE (ques IN ('Q1') AND ans IN ('1'))
AND (ques IN ('Q2') AND ans IN ('5'))
AND (ques = 'Q6' AND ans >= '0' AND ans <= '1375228800')
AND final = '1'
GROUP BY doc_id
除了添加时间戳部分外,它的工作原理...在这种情况下,Q6的值为1375228800。
让这个工作的最佳方式是什么?
答案 0 :(得分:0)
您的查询有一些需要修改的内容。
首先,如果您要与单个值进行比较,则没有理由使用IN子句。所以改变你的
ques IN ('Q1')
到
ques = 'Q1'
和类似情况相同。
其次,我假设您将时间戳存储为整数,而不是字符串。因此,您不应该在引号中包含时间戳,这表示字符串比较。相反,你可以简单地写,
ans >= 0 AND ans <= 1375228800
或者您可以使用BETWEEN运算符
ans BETWEEN 0 and 1375228800
最后,您将英语对“AND”的理解与程序化理解相混淆。如果你说,
(ques IN ('Q1') AND ans IN ('1'))
AND (ques IN ('Q2') AND ans IN ('5'))
你要求问题同时是Q1和Q2,显然是不可能的。相反,您希望使用“OR”子句。鉴于此,您的查询可以重写为
SELECT doc_id FROM submission
WHERE ((ques = 'Q1' AND ans = 1)
OR (ques = 'Q2' AND ans = '5')
OR (ques = 'Q6' AND ans BETWEEN 0 AND 1375228800))
AND final = 1
GROUP BY doc_id
这将选择所有提交的地方: