mysql - MySQL - 在右表中的最后一条记录上左连接
问题描述
我需要一个使用 LEFT JOIN 的查询,我可以在其中找到表 2 的最后一条记录。为此,我正在“ Id
”列中的表 2 中查找表 1 的“ channel
”。
我当前的查询必须为此扩展。我尝试了几种方法,但没有成功。我希望你能帮助我。
表格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
解决方案
您需要一个子查询,它返回每个通道的最后一条消息并加入 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 |
推荐阅读
- mysql - 如何将一个表中的列与另一个表中的多个列配对?
- android - 将视频聊天声音重定向到蓝牙 android
- python - 为什么 python 中的 sqlite3 模块只在一个目录中创建所有数据库?
- groovy - 无法从 groovy 脚本创建带注释的 git 标签
- sql - 在以下 CASE WHEN 语句中使用 SELECT AS 别名 - Spark SQL
- react-final-form - 如何防止将重复值添加到 react-final-form-array 中?
- r - 根据行和列元数据将 data.frame 中的一个值除以备用 data.frame 中的另一个值
- c# - C# Winform 使用 Interop 与 microsoft Outlook 365 应用程序客户端
- python - 如何在 Dash 应用程序的新行上打印
- autodesk-forge - 如何在伪造查看器中创建虚线标记?