Join two tables where table A has a date value and needs to find the next date in B below the date in A

后端 未结 3 1198
情深已故
情深已故 2021-01-26 12:50

I got this table \"A\":

| id | date       |
===================
| 1  | 2010-01-13 |
| 2  | 2011-04-19 |
| 3  | 2011-05-07 |
| .. | ...        |

相关标签:
3条回答
  • 2021-01-26 13:25
    -- Create and fill first table
    CREATE TABLE `id_date` (
      `id` int(11) NOT NULL auto_increment,
      `iddate` date NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    
    INSERT INTO `id_date` VALUES(1, '2010-01-13');
    INSERT INTO `id_date` VALUES(2, '2011-04-19');
    INSERT INTO `id_date` VALUES(3, '2011-05-07');
    
    -- Create and fill second table    
    CREATE TABLE `date_val` (
      `mydate` date NOT NULL,
      `myval` varchar(4) collate utf8_bin NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    
    INSERT INTO `date_val` VALUES('2009-03-29', '0.5');
    INSERT INTO `date_val` VALUES('2010-01-30', '0.55');
    INSERT INTO `date_val` VALUES('2011-08-12', '0.67');
    
    -- Get the result table as asked in question
    SELECT iddate, t2.mydate, t2.myval
    FROM `id_date` t1
    JOIN date_val t2 ON t2.mydate <= t1.iddate
    AND t2.mydate = ( 
    SELECT MAX( t3.mydate ) 
    FROM `date_val` t3
    WHERE t3.mydate <= t1.iddate )
    

    What we're doing:

    • for each date in the id_date table (your table A),
    • we find the date in the date_val table (your table B)
    • which is the highest date in the date_val table (but still smaller than the id_date.date)
    0 讨论(0)
  • 2021-01-26 13:37

    The INNER JOIN return rows when there is at least one match in both tables. Try this.

    Select A.id,A.date,b.value 
    from A inner join B 
    on A.date=b.date 
    
    0 讨论(0)
  • You could use a subquery with limit 1 to look up the latest value in table B:

    select  id
    ,       date
    ,       (
            select  value
            from    B
            where   B.date < A.date
            order by
                    B.date desc
            limit   1
            ) as value
    from    A
    
    0 讨论(0)
提交回复
热议问题