【发布时间】:2015-09-10 01:36:07
【问题描述】:
我需要获取多行,其中 date_added 最接近但不超过用户提供的日期,按 user_id 分组。
我查看了一堆 max in group 类型的答案,但我不完全在那里:
Get nearest records to specific date grouped by type
SQL Query to show nearest date?
Find closest datetime to specified datetime in mysql query
Get closest date from MySQL table
https://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html
这很接近:https://stackoverflow.com/a/17038667/5319244。虽然找到最大日期,但我需要用户输入指定的最大值,而不是完全的最大值。
这是已过滤的具有正确组织 ID、框架 ID 和级别 ID 的数据子集。
+----+---------+-----------------+--------------+----------+---------------------+
| id | user_id | organisation_id | framework_id | level_id | date_added |
+----+---------+-----------------+--------------+----------+---------------------+
| 2 | 1 | 2 | 1 | 1 | 2015-07-31 14:02:49 |
| 9 | 2 | 2 | 1 | 1 | 2015-09-01 11:05:09 |
| 11 | 1 | 2 | 1 | 1 | 2015-09-07 14:13:39 |
+----+---------+-----------------+--------------+----------+---------------------+
如果提供的日期是 2015-09-07。我希望看到 id:9 和 11。
如果提供的日期是 2015-09-01。我希望看到 id:2 和 9。
如果提供的日期是 2015-07-31。我希望看到 id: 2。
这个查询和我得到的一样接近:
SELECT t1.id
, t1.user_id
, t1.date_added
FROM
completed_frameworks AS t1
WHERE date_added = (
SELECT
MAX(date_added)
FROM
completed_frameworks
WHERE
user_id = t1.user_id
AND
date_added <= '2015-09-07 23:59:59'
)
AND
(
t1.organisation_id = 2
AND
t1.framework_id = 1
AND
t1.level_id = 1
)
它返回我对日期的期望:2015-09-07
当日期是 2015-09-01 但是它只返回 id 9。而不是我期望的 2。
当日期为 2015-07-31 时,它返回 0 行..
如果我还有什么可以提供的,请告诉我。
干杯!
编辑:
感谢到目前为止的回复。我需要澄清两点:
1) 我没有限制。由于用户 ID,我期待这些行。可能有 n 个用户返回。我只想为每个用户添加一行,其中 date_added 最接近用户提供的日期。
2) 提供的日期没有时间值。它将来自一个简单的日期选择器 UI。在我的示例查询中,我添加了 23:59:59 的时间来包含当天的所有时间。
【问题讨论】: