【发布时间】:2017-08-08 14:42:31
【问题描述】:
我正在使用两个表(ft_form_1 和 ft_field_options)。
ft_form_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-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_field_options
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
通过下面的查询,我试图从指定的“报告日期”为每个“设施 ID”获取所有提交的列表,其中“列表 ID”等于 1。如果在同一“报告日期”发送多个提交',只会显示具有最新 'timestamp' 的提交。
问题:我认为此查询未按我希望的顺序运行。似乎查询正在查找表中每个“facility_id”的最大“时间戳”,然后过滤以仅显示具有指定“报告日期”的提交。我希望以相反的顺序发生 - 其中查询过滤以仅显示具有指定“reporting_date”的提交,然后缩小列表以仅显示每个“facility_id”的最大“时间戳”。从我上面的例子可以看出,芝加哥和波士顿被排除在名单之外,因为它们在第二天有一个更新的“时间戳”。
我是 MYSQL 新手,感谢任何帮助!我最初从这个链接中得到了 MAX 子查询的想法:http://www.w3resource.com/sql/aggregate-functions/max-date.php
SELECT t1.facility_id, t1.admits, t1.reporting_date, t1.timestamp,
t2.option_name, t2.option_order
FROM ft_form_1 t1
LEFT JOIN ft_field_options t2
ON (t1.facility_id = t2.option_value AND t2.list_id = 1)
WHERE (DATE_FORMAT(t1.reporting_date,'%m/%d/%Y') =
DATE_FORMAT(NOW() - INTERVAL 1 DAY,'%m/%d/%Y')) AND (timestamp=(
SELECT MAX(timestamp)
FROM ft_form_1
WHERE facility_id = t1.facility_id))
ORDER BY option_order ASC
*假设今天是 2017 年 4 月 1 日,上述查询将起作用。
【问题讨论】:
-
您的问题和示例数据有点混乱,难以理解。您能否仅根据显示的输入向我们展示一个干净的输入表以及您期望的确切输出?
-
如果您也将日期限制添加到子查询中,它应该可以按预期工作。子查询现在在整个表中搜索最大值,唯一的限制是facility_id,它与顺序或执行无关。
-
蒂姆,我刚刚清理了一些格式。谢谢!
-
@insider 我认为可行。
标签: mysql join subquery max where