我知道“如何加入最新记录”问题得到了很多,但是,这个问题超出了我的知识。我通常使用“加入最大日期子查询然后加入具有匹配的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
有人可以帮我解决这个问题吗?谢谢!
答案 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 |
+----+---------------------+-----------+