Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于最高日期和非唯一列的MySQL连接_Mysql_Sql_Join - Fatal编程技术网

基于最高日期和非唯一列的MySQL连接

基于最高日期和非唯一列的MySQL连接,mysql,sql,join,Mysql,Sql,Join,我需要一些关于我正在处理的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

我需要一些关于我正在处理的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中得到零或一个ref值。对于表1中的每一行,结果中应该有一行。number列对于这两个表都不是唯一的,因此必须使用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 is 40是因为在表2中,ref=40的记录的date2小于date1,并且是满足该条件的最高日期。 在结果的第二行中,选择了ref为50,因为在表2中,ref=50的记录的date2小于date1,并且是满足该条件的最高日期。 其余结果的引用为空,因为date1总是小于或表2中不存在相应的数字

我已经到了一定程度,但我被卡住了。到目前为止,我的问题是这样的

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,因为它在外部查询中。有什么办法可以让这一切顺利进行吗?

未经测试:

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…

未测试:

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

问题是在subselect的派生表中使用t1…

我刚刚用不同的表尝试了类似的示例,并且能够得到您想要的。下面是为满足您的需要而修改的类似查询。您可能需要更改我刚才用不同的表尝试了类似的示例,并且能够得到您想要的。下面是为满足您的需要而修改的类似查询。你可能想要改变