MySQL join table 像 concat 但只选择最新的行
MySQL join table like concat but only pick latest row
我遇到需要最新状态的情况。有两个 table,我将 table 简化为如下所示:
Table A
+------------+
| a_id |
|------------|
| A1 |
| A2 |
+------------+
Table B
+------------+-------------+------------------+------------------+
| b_id | a_id | status | created_at |
|------------+-------------+------------------+------------------|
| B01 | A1 | something | 2020-03-14 |
| B02 | A1 | something else | 2020-04-15 |
| B03 | A2 | anything | 2020-03-22 |
+------------+-------------+------------------+------------------+
我想显示来自 A 的 table 和 join table B 所以它会像这样显示:
+------------+--------------------+-----------------+
| a.a_id | b.status | b.created_at |
|------------+--------------------+-----------------|
| A1 | something else | 2020-04-15 |
| A2 | anything | 2020-03-22 |
+------------+--------------------+-----------------+
我将感谢 Mysql 查询或 codeigniter 查询生成器。谢谢
如果你是 运行 MySQL 8.0,你可以用 row_number()
:
select a.a_id, b.status, b.created_at
from tablea a
inner join (
select
b.*,
row_number() over(partition by a_id order by created_at desc) rn
from tableb b
) b on a.a_id = b.a_id and b.rn = 1
在早期版本中,一种选择是使用相关子查询进行过滤:
select a.a_id, b.status, b.created_at
from tablea a
inner join tableb b on a.a_id = b.a_id
where b.created_at = (
select max(b1.created_at) from tableb b1 where b1.a_id = b.a_id
)
对于相关子查询解决方案的性能,请考虑 tableb(a_id, created_at)
上的索引。
- 首先从 B table
中找到最新的 created_at 值
示例:SELECT MAX(created_at) FROM B GROUP BY a_id;
然后在下面的查询中使用第一个结果,你会得到你想要的输出。
FROM A
JOIN B ON A.a_id = B.a_id
WHERE B.created_at IN (SELECT MAX(created_at) FROM B GROUP BY a_id);
我遇到需要最新状态的情况。有两个 table,我将 table 简化为如下所示:
Table A
+------------+
| a_id |
|------------|
| A1 |
| A2 |
+------------+
Table B
+------------+-------------+------------------+------------------+
| b_id | a_id | status | created_at |
|------------+-------------+------------------+------------------|
| B01 | A1 | something | 2020-03-14 |
| B02 | A1 | something else | 2020-04-15 |
| B03 | A2 | anything | 2020-03-22 |
+------------+-------------+------------------+------------------+
我想显示来自 A 的 table 和 join table B 所以它会像这样显示:
+------------+--------------------+-----------------+
| a.a_id | b.status | b.created_at |
|------------+--------------------+-----------------|
| A1 | something else | 2020-04-15 |
| A2 | anything | 2020-03-22 |
+------------+--------------------+-----------------+
我将感谢 Mysql 查询或 codeigniter 查询生成器。谢谢
如果你是 运行 MySQL 8.0,你可以用 row_number()
:
select a.a_id, b.status, b.created_at
from tablea a
inner join (
select
b.*,
row_number() over(partition by a_id order by created_at desc) rn
from tableb b
) b on a.a_id = b.a_id and b.rn = 1
在早期版本中,一种选择是使用相关子查询进行过滤:
select a.a_id, b.status, b.created_at
from tablea a
inner join tableb b on a.a_id = b.a_id
where b.created_at = (
select max(b1.created_at) from tableb b1 where b1.a_id = b.a_id
)
对于相关子查询解决方案的性能,请考虑 tableb(a_id, created_at)
上的索引。
- 首先从 B table 中找到最新的 created_at 值
示例:SELECT MAX(created_at) FROM B GROUP BY a_id;
然后在下面的查询中使用第一个结果,你会得到你想要的输出。
FROM A JOIN B ON A.a_id = B.a_id WHERE B.created_at IN (SELECT MAX(created_at) FROM B GROUP BY a_id);