Php MYSQL:最接近按用户id分组的提供日期

Php MYSQL:最接近按用户id分组的提供日期,php,mysql,Php,Mysql,我需要获得多行,其中添加的日期最接近但不超过用户提供的日期,按用户id分组 我已经看了一大堆“最大分组”类型的答案,但我不太清楚: 这很接近:。查找最大日期,但我需要用户输入指定的最大日期,而不是完全的最大日期 以下是已筛选出的具有正确组织id、框架id和级别id的数据子集 +--+-----+---------+-------+-----+-----------+ |id |用户id |组织id |框架id |级别id |添加日期|| +--+-----+---------+-------+-

我需要获得多行,其中添加的日期最接近但不超过用户提供的日期,按用户id分组

我已经看了一大堆“最大分组”类型的答案,但我不太清楚:

这很接近:。查找最大日期,但我需要用户输入指定的最大日期,而不是完全的最大日期

以下是已筛选出的具有正确组织id、框架id和级别id的数据子集

+--+-----+---------+-------+-----+-----------+ |id |用户id |组织id |框架id |级别id |添加日期|| +--+-----+---------+-------+-----+-----------+ | 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。我希望看到身份证: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行

如果我还有什么可以提供的,请告诉我

干杯

编辑:

感谢迄今为止的答复。我需要澄清两点:

我没有限制。由于用户id的原因,我需要这些行。可能返回了n个用户。我只想为每个用户创建一行,其中添加的日期与用户提供的日期最接近


2提供的日期没有时间值。它将来自一个简单的日期选择器用户界面。在我的示例查询中,我添加了23:59:59的时间来涵盖当天的所有时间

以下是一个示例查询,您可以将其用于输入日期“2015-09-07 14:13:39”。内部查询返回输入日期和下一个最高日期。然后,这个临时表用于过滤完成的_框架,只提供从最近两个日期到输入日期的记录

SELECT t1.id, t1.user_id, t1.date_added
FROM completed_frameworks t1
INNER JOIN
(
    SELECT cf.date_added
    FROM completed_frameworks cf
    GROUP BY cf.date_added
    HAVING cf.date_added <= '2015-09-07 14:13:39'
    ORDER BY cf.date_added DESC
    LIMIT 2
) t2
ON t1.date_added = t2.date_added
WHERE t1.organisation_id = 2 AND t1.framework_id = 1 AND t1.level_id = 1

我想这正是你想要的:

SELECT f.id, f.user_id  f.date_added 
FROM completed_frameworks f
WHERE date(f.date_added) <= '2025-09-07'  -- or whatever your date is
ORDER BY f.date_added DESC
LIMIT 2;
编辑:

如果您希望每个用户id有一个最接近指定日期的日期,我建议:

select f.*
from completed_frameworks f join
     (select user_id, max(date_added) as maxda
      from completed_frameworks
      where date(date_added) <= '2015-09-07'
      group by user_id
     ) u
     on f.user_id = u.user_id and f.date_added = maxda

请尝试此子查询。Organization\u id/framework\u id/level\u id过滤器被移动到子查询中,现在它将为您给出的示例返回正确的值

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-01 23:59:59'
    AND
        organisation_id = 2 
    AND 
        framework_id = 1 
    AND 
        level_id = 1
)

你知道的比我多,但我担心他的实际数据集可能在每个日期都有多条记录。@TimBiegeleisen。我不确定这跟它有什么关系。这将检索最近的两个条目。谢谢各位。为了更清楚,我对这个问题进行了编辑。没有限制。预期的结果是由于用户ID。我不是在找最近的两个。@LGH。哦,这个问题完全不同。我假设你实际上拥有的数据比你在子集中提供的数据要多。我想赠送的是单词子集,在这种情况下,子查询可能会返回数据,这些数据随后会被末尾的WHERE语句过滤掉,例如,如果最近添加的记录是针对查询的框架或级别以外的框架或级别。