Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 当日期存储在单独的行中时,如何创建日期范围查询?_Mysql - Fatal编程技术网

Mysql 当日期存储在单独的行中时,如何创建日期范围查询?

Mysql 当日期存储在单独的行中时,如何创建日期范围查询?,mysql,Mysql,一个名为“报告”的表格: 我想创建一个select查询,对报告字段id等于3且报告字段id为1的某个日期或某个日期范围之间的报告值求和。我不确定是否应该使用子查询、连接或其他什么。我对MySQL还是一个新手,但我真的需要它来为我正在进行的项目工作。好吧,让我们试试这个: select sum(r.report_value) as value from report r where r.report_field_id = 3 and exists (

一个名为“报告”的表格:

我想创建一个select查询,对报告字段id等于3且报告字段id为1的某个日期或某个日期范围之间的报告值求和。我不确定是否应该使用子查询、连接或其他什么。我对MySQL还是一个新手,但我真的需要它来为我正在进行的项目工作。

好吧,让我们试试这个:

select
    sum(r.report_value) as value
from
    report r
where
    r.report_field_id = 3
    and exists
    (
        select
            1
        from
            report r1
        where
            r1.report_value_row_id = r.report_value_row_id
            and str_to_date(report_value, '%Y-%m-%d') between '2012-01-04' and '2012-01-05'
            and r1.report_field_id = 1
    )

尽管如此,您的表设计还是相当糟糕的。为什么不为日期、名称和值设置列?这样,您就可以从“2012-01-04”和“2012-01-05”之间的报告中选择总和(值),让您的生活变得轻松!我真诚地质疑你的数据库设计实践。这是一个关系数据库,不是键值存储——像一个一样使用它。

谢谢你的回答,这感觉像是我需要的那种东西。但是,您的代码返回空值。我猜你也打错了;假设我的表被称为report,那么“reports r1”不应该是“report r1”吗?该表是这样设计的,因为我们的应用程序永远无法确定我们将在给定的报告中使用多少字段。它们在数量和数据类型上都发生了变化。发现了另一个打字错误,一旦修复,它就会按预期工作。“%Y-%M-%d”应该是“%Y-%M-%d”。谢谢您的帮助!您的答案是子查询的示例吗?@trnsfrmr-很高兴您能使用它!我已经为您编辑了输入错误。无论如何,是的,这是一种子查询类型。但是,它不是相关子查询(针对每行运行)。而是运行子查询,然后使用联接(由于使用了
exists
命令)将结果数据与之前返回的数据集进行匹配。很有趣!我对MySQL了解得越多,就越喜欢它。恕我直言,这种表设计完全不合理。最初为什么要这样设计?因为我们的应用程序不确定需要多少字段和什么数据类型。
select
    sum(r.report_value) as value
from
    report r
where
    r.report_field_id = 3
    and exists
    (
        select
            1
        from
            report r1
        where
            r1.report_value_row_id = r.report_value_row_id
            and str_to_date(report_value, '%Y-%m-%d') between '2012-01-04' and '2012-01-05'
            and r1.report_field_id = 1
    )