【问题标题】:One to many query with two date constraints具有两个日期约束的一对多查询
【发布时间】:2012-05-25 23:13:49
【问题描述】:

我必须为一种版本控制系统编写报告查询,在该系统中我需要检索最新版本的基于日期的报告变体。简化的表结构是:

items_register: ir_id (primary, auto inc), ir_name (varchar)
items: i_id (primary, auto inc), i_register_id (int), i_version_name (varchar), i_datetime (datetime), i_date_expiry (datetime)

items_register 中的每个条目都有多个关联版本,作为条目存储在 items 表中 - i_datetime 的最高值是最新版本。

我想从 items_register 中检索条目,其中最新版本 (item) 在请求的日期 ($f_date) 之后具有 i_date_expiry。

我想我需要以某种方式加入表格,按 i_datetime 对项目进行排序,将它们限制为 1,以便我获得最新版本,然后检查 i_date_expiry 是否在 $f_date 之后,如果是则检索字段。

我要检索的字段是 items_register.ir_id、items_register.ir_name、items.i_version_name、items.i_datetime。

TIA 寻求帮助。

【问题讨论】:

    标签: php mysql one-to-many


    【解决方案1】:

    您似乎正在搜索“groupwise max”模式。

    对您的问题中仍不清楚的事情做出一些假设,我认为这可能是您正在寻找的查询:

    SELECT items_register.ir_id, items_register.ir_name, 
        items.i_version_name, items.i_datetime
    FROM items_register
    JOIN
    (
        SELECT items.i_register_id, 
            MAX(items.i_datetime) AS most_recent_item_datetime
        FROM items
        WHERE items.i_date_expiry > '$f_date'
        GROUP BY items.i_register_id
    ) AS item_date ON item_date.i_register_id = items_register.ir_id
    JOIN items ON items.i_register_id = items_register.ir_id 
        AND items.i_datetime = item_date.most_recent_item_datetime
    

    请记住,这假定 $f_date 是符合this documentation page 中规定的日期时间和时间戳文字(不是日期文字!)标准的字符串。

    【讨论】:

    • 谢谢棘手的,这似乎是我需要的。目前我没有足够的数据进行全面测试,但你的回答给了我无论如何我都希望的“灯泡”时刻。为我的问题中的任何混淆道歉,我认为我有点太接近它了。我会尽快奖励你 - 22 小时内。
    • 感谢您的赏金,很高兴能帮上忙!
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2013-03-17
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多