如何在mysql中的连接中获取字段的最新值

时间:2013-07-19 16:56:45

标签: mysql

考虑两个表:

house_market_changes
 date        | house_id | market_status
---------------------------------
 2013-04-03  | 1        | "on"
 2013-04-06  | 1        | "under offer"
 2013-04-11  | 1        | "off"
 2013-04-02  | 2        | "on"
 ...

house_market_changes告诉我们房子改变了什么以及何时改变。

agent_visit
 date        | house_id | agent_id
---------------------------------
 2013-04-05  | 1        | 1
 2013-04-06  | 1        | 1
 2013-04-08  | 1        | 1
 2013-04-09  | 1        | 1
 2013-04-10  | 1        | 1
 2013-04-12  | 1        | 1
 ...

agent_visit告诉我们代理人什么时候去看房子。

我想要查询这些结果:

agent_visit_info
 date        | house_id | agent_id | house_market_status
-----------------------------------------------
 2013-04-05  | 1        | 1        | "on"
 2013-04-06  | 1        | 1        | "under offer"
 2013-04-08  | 1        | 1        | "under offer"
 2013-04-09  | 1        | 1        | "under offer"
 2013-04-10  | 1        | 1        | "under offer"
 2013-04-12  | 1        | 1        | "off"
 ...

house_market_status列告诉我们该日期房屋的状态。因此house_market_status是访问日期之前或之后market_status的最新值。

任何人都知道怎么做?

2 个答案:

答案 0 :(得分:0)

这是一个混乱的陈述,但我认为会给你你想要的结果,

SELECT  b.*, a.market_status
FROM
        (
            SELECT  a.date StartDate,
                    COALESCE(b.date - INTERVAL 1 DAY, a.date + INTERVAL 999 YEAR) EndDate,
                    a.house_id,
                    a.market_status
            FROM
                    (
                        SELECT  a.date, 
                                a.house_id, 
                                a.market_status,
                                (
                                    SELECT  COUNT(*)
                                    FROM    house_market_changes b
                                    WHERE   b.house_id = a.house_id AND
                                            b.date <= a.date
                                ) AS RowNumber
                        FROM    house_market_changes a
                    ) a 
                    LEFT JOIN
                    (
                        SELECT  a.date, 
                                a.house_id, 
                                a.market_status,
                                (
                                    SELECT  COUNT(*)
                                    FROM    house_market_changes b
                                    WHERE   b.house_id = a.house_id AND
                                            b.date <= a.date
                                ) AS RowNumber
                        FROM    house_market_changes a
                    ) b ON  a.house_id = b.house_id AND
                            a.RowNumber + 1 = b.RowNumber
        ) a
        INNER JOIN agent_visit b
            ON  b.date BETWEEN a.StartDate AND a.EndDate AND
                a.house_id = b.house_id

输出

╔════════════╦══════════╦══════════╦═══════════════╗
║    DATE    ║ HOUSE_ID ║ AGENT_ID ║ MARKET_STATUS ║
╠════════════╬══════════╬══════════╬═══════════════╣
║ 2013-04-05 ║        1 ║        1 ║ on            ║
║ 2013-04-06 ║        1 ║        1 ║ under offer   ║
║ 2013-04-08 ║        1 ║        1 ║ under offer   ║
║ 2013-04-09 ║        1 ║        1 ║ under offer   ║
║ 2013-04-10 ║        1 ║        1 ║ under offer   ║
║ 2013-04-12 ║        1 ║        1 ║ off           ║
╚════════════╩══════════╩══════════╩═══════════════╝

简要说明:

查询需要为每个house_id生成序列号,用于连接其他子查询以获取开始日期结束日期 market_status的。{子查询的结果记录将通过agent_visit加到表house_id上,并且date介于market_status的日期范围之间。

答案 1 :(得分:0)

你的问题的逻辑是下一个。

您需要将第一行日期字段与house_market_changes表中的第二行字段进行比较,并检查em之间的范围。如果date1&lt; date2,agent_visit表中的所有行都将具有date1的market_status,并在下一次迭代时再次执行(if(date2&lt; date3)...)。

我的问题是我不是SQL中的专业人员所以我无法将其转换为SQL代码,我希望这可以帮助您以任何形式