在主表中加入最近的记录

时间:2018-03-22 03:25:22

标签: mysql join

我知道“如何加入最新记录”问题得到了很多,但是,这个问题超出了我的知识。我通常使用“加入最大日期子查询然后加入具有匹配的id和时间的行”方法来解决问题,我可以在子查询的where子句中添加其他条件,但是这种样式在这里不起作用情况。

我正在寻找第一张表中所有记录的历史记录,并在第一张记录之前从第二张表中加入最新记录。

示例:

CREATE TABLE `A` (
  `id` int(11) NOT NULL,
  `a_time` timestamp NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `A` (`id`, `a_time`) VALUES
(1, '2018-03-21 04:30:00'),
(2, '2018-03-21 05:30:00'),
(3, '2018-03-21 07:30:00'),
(4, '2018-03-21 12:30:00');

CREATE TABLE `B` (
  `id` int(11) NOT NULL,
  `b_time` timestamp NOT NULL,
  `some_text` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `B` (`id`, `b_time`, `some_text`) VALUES
(1, '2018-03-21 05:30:00', 'Foo'),
(2, '2018-03-21 09:30:00', 'Bar');


ALTER TABLE `A`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `B`
  ADD PRIMARY KEY (`id`);

我希望的是来自A的id和时间,以及来自B的最新(< =)some_text

a.id a.a_time            b.some_text
------------------------------------
1    2018-03-21 04:30:00 null
2    2018-03-21 05:30:00 Foo
3    2018-03-21 07:30:00 Foo
4    2018-03-21 12:30:00 Bar

有人可以帮我解决这个问题吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我会使用"相关子查询"像这样:

查询1

select
       a.*
    , (select b.some_text from b
       where b.b_time <= a.a_time
       order by b.b_time DESC
       limit 1) as some_text
from a
order by a.id

<强> Results

| id |               a_time | some_text |
|----|----------------------|-----------|
|  1 | 2018-03-21T04:30:00Z |    (null) |
|  2 | 2018-03-21T05:30:00Z |       Foo |
|  3 | 2018-03-21T07:30:00Z |       Foo |
|  4 | 2018-03-21T12:30:00Z |       Bar |

答案 1 :(得分:1)

我可能会使用非核心子查询,如下所示:

SELECT x.some
     , c.columns
     , y.some_column
  FROM 
     ( SELECT a.*
            , MAX(b.b_time) b_time 
         FROM a
         LEFT 
         JOIN b 
           ON b.b_time <= a.a_time 
        GROUP 
           BY id
     ) x 
  LEFT 
  JOIN b y 
    ON y.something = x.something;
+----+---------------------+-----------+
| id | a_time              | some_text |
+----+---------------------+-----------+
|  1 | 2018-03-21 04:30:00 | NULL      |
|  2 | 2018-03-21 05:30:00 | Foo       |
|  3 | 2018-03-21 07:30:00 | Foo       |
|  4 | 2018-03-21 12:30:00 | Bar       |
+----+---------------------+-----------+