【问题标题】:Get results from mySQL database based on timestamp and other criteria in multiple rows根据多行中的时间戳和其他条件从 mySQL 数据库中获取结果
【发布时间】:2013-08-06 15:46:58
【问题描述】:

我有一个数据库,其中只有几个表,这些表是根据通过不断变化的表单内容提交的值填充的,这些表单内容包含许多复选框、单选、选择列表变量等...

表单的每个元素都附有一个唯一的 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,它可以工作,但是当指定日期时它不起作用。

搜索条件可以随时更改,除了尝试按时间戳过滤结果(例如显示 Unix 时间戳“1375228800”的“ans”字段)外,它大部分都可以正常工作

这是一个例子:

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。

什么是让它工作的最佳方法?

【问题讨论】:

    标签: mysql sql search checkbox


    【解决方案1】:

    您的查询有几处需要修改。

    首先,如果您要与单个值进行比较,则没有理由使用 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'))
    

    您要求 ques 同时是 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
    

    这将选择所有提交,其中:

    • 问题是Q1,答案是1,最终是1
    • 问题是Q2,答案是5,最终是1
    • 问题是Q6,答案在0到1375228800之间,最终是1

    【讨论】:

    • 我明白你在说什么,但也许我需要澄清查询在做什么,因为这种方法仍然行不通。所有的“问题”都可以在表格中有多个条目。例如,在提交时,如果用户在文档 2 上为 Q1 选中了“1”、“2”和“6”,那么 Q1 将被添加到数据库中 3 次。现在如果有人在Q6字段中搜索包含“2”和“6”且时间小于1375228800的文档,那么应该找到文档2
    猜你喜欢
    • 2020-07-20
    • 2020-03-07
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多