【问题标题】:SQL multi-table JOINSQL多表JOIN
【发布时间】:2021-12-23 07:19:09
【问题描述】:

我需要你的帮助来处理 3 个表的 SQL 查询。

第一个表(#chats) 聊天ID;第一个用户ID;第二个用户ID

第二张表(#users) 用户身份;用户昵称

第三张表(#messages) 消息ID,聊天ID; messageToWalletId;读取指标

我需要接收:

  1. 所有#chats 列表 WHERE firstUserId = ?或 secondUserId = ?
  2. 对于 1) 的特定输出,从关系 chats.firstUserId=users.userId + chats.secondUserId=users.userId 的表 users 中添加 userNickname
  3. 从#messages 表中仅获取最后一条消息,并从第 1 点返回“messageToWalletId”和“readIndicator”WHERE chatId = chatId)(ps:有更多消息发送到同一个 chatId,因此只有最后一条消息(按 messageId 排序)

前两点很简单:

        $queryGetChats = '
            SELECT 
                t1.chatId, t1.firstUserId, t1.secondUserId, 
                t2.userNickname AS firstUserNickname, 
                t3.userNickname AS secondUserNickname
            FROM chat AS t1
                LEFT JOIN users AS t2 ON t1.firstUserId = t2.userId
                LEFT JOIN users AS t3 ON t1.secondUserId = t3.userId
            WHERE firstUserId = ? OR secondUserId = ? 
            ORDER BY t1.chatId DESC;
        ';
        $paramsChats = (array($userId, $userId));
        
        return Db::queryAll($queryGetChats, $paramsChats);

但是如果我需要使用表#chats 中的 chatId 创建 WHERE 子句,我无法弄清楚第三个,它不能传递给 LEFT JOIN (SELECT ...)。

所以输出会有一个数组: array(chatId, firstUserId, secondUserId, firstUserNickname, secondUserNickname, messageToWalletId, readIndicator)

感谢您的帮助

【问题讨论】:

  • 我忘了提到输出可能包含更多聊天,因此返回多数组。我得到“操作数应包含 1 列”。所以调用可能发生:1)用户有 5 个聊天(基于 SELECT 条件)2)每个聊天返回数组,包括提到的字段 3)最终将返回聊天数组数组

标签: sql join left-join


【解决方案1】:
with messages_sort as (
Select
 m.*,
 rank() over (partition by chatId order by messageId desc) as rn
from messages m 
)

Select 
 messageToWalletId, readIndicator
from messages_sort 
where rn = 1
and chatId in (Select chatId from chats) -- you can change this select statement with the query for point 1 that returns the chatId's for that scenario.

;

【讨论】:

  • 谢谢。我忘了提到输出可能包含更多聊天,因此返回多数组。最后一部分“操作数应包含 1 列”。所以调用可能发生:1)用户有 5 个聊天(基于 SELECT 条件)2)每个聊天返回数组,包括提到的字段 3)最终将返回聊天数组数组
  • 有什么更新吗?
猜你喜欢
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多