【问题标题】:MySQL JOIN based on highest date and non-unique columnsMySQL JOIN 基于最高日期和非唯一列
【发布时间】:2011-06-09 02:06:44
【问题描述】:

我需要一些关于我正在处理的 MySQL 查询的帮助。我的数据如下。

表 1

id   date1        text     number
---|------------|--------|-------
1  | 2012-12-12 | hi     | 399 
2  | 2011-11-11 | so     | 399
5  | 2010-10-10 | what   | 555
3  | 2009-09-09 | bye    | 300
4  | 2008-08-08 | you    | 300

表 2

id   number   date2        ref
---|--------|------------|----
1  | 399    | 2012-06-06 | 40
2  | 399    | 2011-06-06 | 50
5  | 555    | 2011-03-03 | 60

对于表 1 中的每一行,我想从表 2 中获取零个或一个参考值。表 1 中的每一行的结果中都应该有一行。数字列对于任一表都不是唯一的,所以必须使用 date1 和 date2 列进行连接,其中 date2 是数字的最大值,但不超过该数字的 date1。

上述示例的预期结果应该是这样的。

 date1        text     number   ref
------------|--------|--------|-----
 2012-12-12 | hi     | 399    | 40
 2011-11-11 | so     | 399    | 50
 2010-10-10 | what   | 555    | null
 2009-09-09 | bye    | 300    | null
 2008-08-08 | you    | 300    | null

您可以在结果的第一行中看到,选择了 ref 为 40,因为在 table2 中,ref=40 的记录有一个小于 date1 的 date2,以及满足该条件的最高日期。 在结果的第二行中,选择了 ref 为 50,因为在 table2 中,ref=50 的记录的 date2 小于 date1,并且是满足该条件的最高日期。 其余结果的引用为空,因为 date1 总是小于或 table2 中不存在相应的数字。

我已经到了某个点,但我被卡住了。我目前的查询是这样的。

SELECT date1, text, number, ref
FROM table1
LEFT JOIN (
    SELECT * 
    FROM (
        SELECT * 
        FROM table2
        WHERE date2 <= '2012-12-12'
        ORDER BY date2 DESC
    ) tmp 
    GROUP BY msisdn
) tmp ON table1.number = table2.number;

问题是硬编码的日期不行,它应该基于date1,但我不能使用date1,因为它在外部查询中。有什么办法可以让我完成这项工作吗?

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    我刚才用不同的表尝试了类似的例子,并且能够得到你想要的。以下是修改后的类似查询以满足您的需求。如果这是您要查找的内容,您可能希望将 &lt; 更改为 &lt;=

    SELECT a.date1, a.text, b.ref
    FROM table1 a LEFT JOIN table2 b ON 
                            ( a.number = b.number
                              AND  a.date1 > b.date2 
                              AND b.date2 = ( SELECT MAX(x.date2) 
                                              FROM table2 x 
                                              WHERE x.number = b.number 
                                                 AND x.date2 < a.date1)
                            )
    

    【讨论】:

      【解决方案2】:

      未经测试:

      SELECT t1.date1, 
             t1.text,
             t1.number,
             (SELECT a.ref
                FROM TABLE_2 a
                JOIN (SELECT t.number,
                             MAX(t.date2) AS max_date
                        FROM TABLE_2 t
                       WHERE t.number = t1.number
                         AND t.date2 <= t1.date1
                    GROUP BY t.number) b ON b.number = a.number
                                        AND b.max_date = a.date2)
        FROM TABLE_1 t1
      

      问题是在子选择的派生表中使用t1...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        相关资源
        最近更新 更多