首页 > 解决方案 > MySQL - 在右表中的最后一条记录上左连接

问题描述

我需要一个使用 LEFT JOIN 的查询,我可以在其中找到表 2 的最后一条记录。为此,我正在“ Id”列中的表 2 中查找表 1 的“ channel”。

我当前的查询必须为此扩展。我尝试了几种方法,但没有成功。我希望你能帮助我。

https://murrayhopkins.wordpress.com/2008/10/28/mysql-left-join-on-last-or-first-record-in-the-right-table/

表格1

id  id1  id2 g_id1  g_id2   datum
1    1    2    x     x    timestamp
2    3    1    x     x    timestamp  
3    3    2    x     x    timestamp

表 2

n_id    channel absender     nachricht            datum
1         1        2        messagetext1    2019-09-22 19:30:31
2         1        1        messagetext2    2019-09-22 19:35:31  
3         2        1        messagetext3    2019-09-22 19:40:31
3         2        3        messagetext4    2019-09-22 19:42:31
4         3        2        messagetext5    2019-09-22 20:40:31

表3

id    firmenname  
1    companyname1
2    companyname2    
3    companyname3    

输出

id  id1  id2 g_id1  g_id2   datum      firmenname     firmenname2   nachricht
1    1    2    x     x    timestamp   companyname1   companyname2  messagetext2
2    2    1    x     x    timestamp   companyname2   companyname1  messagetext4
3    3    2    x     x    timestamp   companyname3   companyname2  messagetext5

我当前的查询

SELECT a.*, b.firmenname as firmenname1, c.firmenname as firmenname2 FROM nachrichtensystem a LEFT JOIN spieler b ON a.id1 = b.id LEFT JOIN spieler c ON a.id2 = c.id WHERE id1 = $sp_id OR id2 = $sp_id ORDER BY a.timestamp DESC LIMIT $id, 8

声明表 1 id 是 ChannelId。我需要孔表 1 和表 2 中来自此频道的最后一条消息。这与表 3 中的 LIMIT 和公司名称(公司名称)。在我当前的查询中,只缺少表 2 中最后一条消息的部分。公司名称1 和 2 来自表 3 这是我需要的

ORDER BY timestamp DESC LIMIT $id, 8

标签: mysql

解决方案


您需要一个子查询,它返回每个通道的最后一条消息并加入 table1,然后加入 table3 两次:

select t1.*, t31.firmenname, t32.firmenname firmenname2, t2.nachricht 
from table1 t1 
left join (
  select t.* from table2 t
  where not exists (
    select 1 from table2
    where channel = t.channel and datum > t.datum
  )
) t2 on t2.channel = t1.id
left join table3 t31 on t31.id = t1.id1
left join table3 t32 on t32.id = t1.id2
order by t1.id

请参阅演示
结果:

| id  | id1 | id2 | g_id1 | g_id2 | datum     | firmenname   | firmenname2  | nachricht    |
| --- | --- | --- | ----- | ----- | --------- | ------------ | ------------ | ------------ |
| 1   | 1   | 2   | x     | x     | timestamp | companyname1 | companyname2 | messagetext2 |
| 2   | 3   | 1   | x     | x     | timestamp | companyname3 | companyname1 | messagetext4 |
| 3   | 3   | 2   | x     | x     | timestamp | companyname3 | companyname2 | messagetext5 |

推荐阅读