【问题标题】:MYSQL select oldest record nearest to given date but not olderMYSQL 选择最接近给定日期但不旧的记录
【发布时间】:2012-08-03 23:40:08
【问题描述】:

我有一个表,其中包含属于不同用户的记录。

表:

RECORD_ID     USER_ID     DATE_CREATED
1             5           08/05/12
2             5           08/04/12
3             10          08/05/12
4             10          08/02/12
5             10          08/01/12

查询:

SELECT user_id, MIN(date_created) as date_created
FROM (entries) 
GROUP BY user_id

查询返回每个用户最旧的记录。

RECORD_ID     USER_ID     DATE_CREATED
2             5           08/04/12
5             10          08/01/12

如何选择最接近给定日期但不旧的最旧记录?类似的东西......

SELECT oldest record > given oldest record
WHERE oldest record NOT =< given oldest record

例如查询返回用户10的所有记录:

RECORD_ID     USER_ID     DATE_CREATED
3             10          08/05/12
4             10          08/02/12
5             10          08/01/12

用户10 的给定日期是08/02/12。现在我必须选择08/02/12 上方的下一个最旧记录。

那将是08/05/12,除非它到达顶部,否则永远不会记录低于该值。这在 MYSQL 中怎么可能?

【问题讨论】:

  • 日期存储在什么样的字段中?是 unix 时间戳还是其他?

标签: php mysql sql database


【解决方案1】:

您可以结合使用WHERELIMIT

SELECT user_id, content, MIN(date_created) as date_created
FROM (entries) 
WHERE date_created > '2012-08-02'
GROUP BY user_id
LIMIT 1

WHERE 声明将处理日期问题。 LIMIT 语句将使您的结果减少到一行。显然,您可以将 2012-08-02' 更改为变量或您需要的任何日期。

【讨论】:

    【解决方案2】:

    $date_given 有给定的日期。

    SELECT user_id, MIN(date_created) as date_created
    FROM (entries) 
    WHERE date_created > $date_given
    GROUP BY user_id
    LIMIT 1
    

    【讨论】:

      【解决方案3】:

      怎么样

      从 date_created > somedate order by date_created desc limit 1 的条目中选择 user_id, date_created

      【讨论】:

        【解决方案4】:

        这是为所有具有 record_id 的用户选择最近记录的查询。只需将 '08/02/12' 更改为您需要的日期:

        select 
            entries.record_id,entries.user_id, entries.Date_created 
        from entries
        join
        (select 
              user_id,min(Date_created) minDate 
                   from entries 
                   where Date_Created>'08/02/12' 
              group by user_id
        ) minDates on (entries.user_id=minDates.user_id) 
                      and 
                      (entries.Date_created=minDates.minDate)
        

        【讨论】:

        • 谢谢,我不明白您为什么要选择两次并加入同一个表格。
        • 此查询不仅输出 Date_created,还输出包含此 Date_created 的表中的完整记录
        • 也许我不明白,但这也应该在 1 个连接中使用 AND 子句。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多