mysql连接表类似concat,但只选择最新的行

f4t66c6m  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(290)

我有需要最新情况的案子。有两个表,我简化了我的表,如下所示:

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      |
+------------+-------------+------------------+------------------+

我想用连接表b显示a中的表,所以它将显示如下:

+------------+--------------------+-----------------+
|  a.a_id    |  b.status          |  b.created_at   |
|------------+--------------------+-----------------|
|  A1        |  something else    |  2020-04-15     |
|  A2        |  anything          |  2020-03-22     |
+------------+--------------------+-----------------+

我会感激mysql查询或codeigniter查询生成器。谢谢您

hsgswve4

hsgswve41#

如果您运行的是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) .

unguejic

unguejic2#

首先从b表中找到最新创建的\u 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);

相关问题