MYSQL帮助-操作顺序和子查询
我正在使用两个表(ft\ U表单\ U 1和ft\字段\ U选项) ft\u表单1MYSQL帮助-操作顺序和子查询,mysql,join,subquery,max,where,Mysql,Join,Subquery,Max,Where,我正在使用两个表(ft\ U表单\ U 1和ft\字段\ U选项) ft\u表单1 submission_id facility_id admits reporting_date timestamp 1 111A 1 2017-03-31 00:00 2017-03-31 17:53:17 2 222B 3 2017-03-31 00:00 2017
submission_id facility_id admits reporting_date timestamp
1 111A 1 2017-03-31 00:00 2017-03-31 17:53:17
2 222B 3 2017-03-31 00:00 2017-03-31 18:42:20
3 333C 6 2017-03-31 00:00 2017-03-31 19:27:47
4 222B 0 2017-04-01 00:00 2017-04-01 18:12:12
5 333C 4 2017-03-31 00:00 2017-04-01 19:38:25
6 333C 5 2017-04-01 00:00 2017-04-01 20:31:16
ft\u字段选项
list_id option_order option_value option_name
1 4 111A New York
1 2 222B Chicago
1 1 333C Boston
1 3 444D Miami
我目前得到的信息:
facility_id option_name option_order admits reporting_date timestamp
111A New York 3 1 2017-03-31 00:00 2017-03-31 17:53:17
facility_id option_name option_order admits reporting_date timestamp
111A New York 3 1 2017-03-31 00:00 2017-03-31 17:53:17
222B Chicago 2 3 2017-03-31 00:00 2017-03-31 18:42:20
333C Boston 1 4 2017-03-31 00:00 2017-04-01 19:38:25
我想要的:
facility_id option_name option_order admits reporting_date timestamp
111A New York 3 1 2017-03-31 00:00 2017-03-31 17:53:17
facility_id option_name option_order admits reporting_date timestamp
111A New York 3 1 2017-03-31 00:00 2017-03-31 17:53:17
222B Chicago 2 3 2017-03-31 00:00 2017-03-31 18:42:20
333C Boston 1 4 2017-03-31 00:00 2017-04-01 19:38:25
通过下面的查询,我正在尝试获取从指定的“报告日期”到每个“设施id”的所有提交的列表,其中“列表id”等于1。如果在同一“报告日期”发送多份提交,则仅显示具有最新“时间戳”的提交
问题:我认为此查询没有按我希望的顺序运行。查询似乎正在查找表中每个“设施id”的最大“时间戳”,然后进行筛选,以仅显示具有指定“报告日期”的提交。我希望这种情况以相反的顺序出现-查询过滤只显示具有指定“报告日期”的提交,然后缩小列表范围,只显示每个“设施id”的最大“时间戳”。正如我上面的示例所示,芝加哥和波士顿被排除在名单之外,因为他们在第二天有一个较新的“时间戳”
我是一个MYSQL新手,所以非常感谢您的帮助!我最初是通过以下链接了解到MAX子查询的概念:
*假设今天是2017年4月1日,上面的查询可以正常工作。这里的答案是使用结构化查询语言的结构化部分。SQL是一种声明性语言,而不是过程性语言,因此考虑它的工作顺序可能会让人感到困惑 首先,您要查找列表id为1的行。让我们做一个查询来得到它。注意使用了
JOIN
而不是LEFT JOIN
:我们不想要不匹配的元素。()
接下来,我们需要找到每个设施在每个报告日期最后一次提交的时间戳。()
这类子查询是一种很好的方法,因为它们很容易测试
最后,我们将这两个子查询连接在一起以得到我们想要的。()
诀窍在于groupby
子查询中,它查找每个报告日期的最后一个时间戳
现在,您的表中有一个提交id。如果提交id是自动递增的,则每个协作室中报告数据的最大提交id值可能就是您想要的值如果这是真的您可以大大简化查询
这将获取与所需提交相对应的提交id值
SELECT MAX(submission_id)
FROM ft_form_1
GROUP BY reporting_date, facility_id
您可以像这样将其连接到主表,以获得所需的结果。()
这里的答案是使用结构化查询语言的结构化部分。SQL是一种声明性语言,而不是过程性语言,因此考虑它的工作顺序可能会让人感到困惑 首先,您要查找列表id为1的行。让我们做一个查询来得到它。注意使用了
JOIN
而不是LEFT JOIN
:我们不想要不匹配的元素。()
接下来,我们需要找到每个设施在每个报告日期最后一次提交的时间戳。()
这类子查询是一种很好的方法,因为它们很容易测试
最后,我们将这两个子查询连接在一起以得到我们想要的。()
诀窍在于groupby
子查询中,它查找每个报告日期的最后一个时间戳
现在,您的表中有一个提交id。如果提交id是自动递增的,则每个协作室中报告数据的最大提交id值可能就是您想要的值如果这是真的您可以大大简化查询
这将获取与所需提交相对应的提交id值
SELECT MAX(submission_id)
FROM ft_form_1
GROUP BY reporting_date, facility_id
您可以像这样将其连接到主表,以获得所需的结果。()
你的问题和样本数据有点混乱,很难理解。您能否仅基于显示的输入向我们显示一个干净的输入表以及您期望的确切输出?如果您也将日期限制添加到子查询中,它应该会像您期望的那样工作。子查询现在在整个表中搜索最大值,唯一的限制是facility_id,它与顺序或执行无关。谢谢@内幕人士我认为这是可行的。你的问题和样本数据有点混乱,很难理解。您能否仅基于显示的输入向我们显示一个干净的输入表以及您期望的确切输出?如果您也将日期限制添加到子查询中,它应该会像您期望的那样工作。子查询现在在整个表中搜索最大值,唯一的限制是facility_id,它与顺序或执行无关。谢谢@我认为这很有效。你应该加入你自己的SELECT和ORDER BY子句来获得你所需要的精确列。看起来很整洁。我在哪里将报告日期设置为等于某个标准,例如=date_FORMAT(NOW()-INTERVAL 1 DAY,“%m/%d/%Y”)?我会在底部附近再加一个吗?而且,我不确定我是否理解下面发生的事情。为什么列引用了两次,中间没有逗号。抱歉,正在慢慢地拿起mysql。。。选择MAX(timestamp)timestamp、reporting_date reporting_date、facility_i您应该在自己的SELECT和ORDER BY子句中输入您需要的确切列。看起来很整洁。我在哪里将报告日期设置为等于某个标准,例如=date_FORMAT(NOW()-INTERVAL 1 DAY,“%m/%d/%Y”)?我会在底部附近再加一个吗?而且,我不确定我是否理解下面发生的事情。为什么列引用了两次,中间没有逗号。抱歉,正在慢慢地拿起mysql。。。选择最大(时间戳)时间戳、报告日期报告日期、设施id
SELECT MAX(submission_id)
FROM ft_form_1
GROUP BY reporting_date, facility_id
SELECT t1.*
FROM ft_form_1 t1
JOIN ft_field_options t2 ON t1.facility_id = t2.option_value
AND t2.list_id = 1
JOIN (
SELECT MAX(submission_id) submission_id
FROM ft_form_1
GROUP BY reporting_date, facility_id
) q ON t1.submission_id = q.submission_id