繁体   English   中英

SQL查询一行中同一列的多个值

[英]SQL Query Multiple Values Of Same Column In One Row

我试图在一行中获取对话列表以及与之关联的参与者以及给定用户的最后一条消息。 我正在寻找的结果是这样的:

**|  conversationId  |  participants  |  text  | timestamp |**
           67           aester,bester    Hello    00:00:00

上面的模型只是一行。 我试图与上述结果的所有行。 文本列是与该会话关联的最后一条消息。

这是我的模型:

用户数

userId|username|
   87   aester
   89   cester
   96   bester

对话内容

|conversationId|
      67
      68

留言内容

| messageId |  text  |  timestamp  |  conversation_id  |  user_id
     41        Hello     00:00:00           67               87
     42        Hey       00:00:00           68               89 

用户对话

| id | conversation_id | user_id
   3          67            87
   4          67            96
   5          68            89

如何查询上述模型以获得所需结果?

当前更新:

SELECT conversations.`conversationId` as conversationId, 
GROUP_CONCAT(users.`username`) as participants FROM users
LEFT JOIN user_conversations 
ON users.`userId` = user_conversations.`user_id`
LEFT JOIN conversations
ON user_conversations.`conversation_id` = 
conversations.`conversationId`
WHERE EXISTS (SELECT * FROM user_conversations WHERE 
user_conversations.user_id = 87)
GROUP BY conversations.`conversationId`;

上面产生的是我想要的,除了我无法弄清楚如何也获得每一行的最后一条消息:

|  conversationId  |  participants  |
         67           aester,bester
         68              cester

如果我正确理解了您的问题,则希望将现有查询与“消息”表合并,以使您获得每次对话的最新消息。 可以这样完成。

首先创建一个子查询,以获取每个对话的最新消息,如下所示

select message_id as last_message_id, text as last_text, conversation_id, user_id, max(timestamp) from         
(select * from `Messages`
order by conversation_id, timestamp desc)q
group by conversation_id; 

现在,使用session_id列作为联接条件,将上述子查询与您的查询联接。 这将根据您的结果填充最后一条消息

您的最终查询将如下所示

SELECT conversations.`conversationId` as conversationId, 
GROUP_CONCAT(users.`username`) as participants FROM users
LEFT JOIN user_conversations 
ON users.`userId` = user_conversations.`user_id`
LEFT JOIN conversations
ON user_conversations.`conversation_id` = 
conversations.`conversationId`
WHERE EXISTS (SELECT * FROM user_conversations WHERE 
user_conversations.user_id = 87)
LEFT JOIN 
(select message_id as last_message_id, text as last_text, conversation_id, user_id, max(timestamp) from         
(select * from `Messages`
order by conversation_id, timestamp desc)q
group by conversation_id) subquery
on conversations.`conversationId` = subquery.`conversation_id`
GROUP BY conversations.`conversationId`;

如果您需要对话列表,那么我们首先从UserConversations开始,获取每个conversation_id的参与者列表

SELECT uc.`conversation_id`,
       GROUP_CONCAT(u.`username`)  as participants      
FROM UserConversations1 uc
JOIN Users1 u
  ON uc.`user_id`= u.`userId` 
GROUP BY `conversation_id`  
HAVING COUNT(IF(uc.`user_id` = 87, 1, NULL)) > 0; 
    -- This check if the user in on the conversation.

然后,我们发现每个conversation_id的最后一条消息是什么

SELECT `conversation_id` , MAX(`messageId`) as `messageId`
FROM Messages1
GROUP BY `conversation_id`;

然后,我们将所有内容结合在一起:

SQL演示

SELECT conversation.`conversation_id`,
       conversation.`participants`,
       m.text,
       m.timestamp
FROM (  SELECT uc.`conversation_id`,
               GROUP_CONCAT(u.`username`)  as `participants`      
        FROM UserConversations1 uc
        JOIN Users1 u
          ON uc.`user_id`= u.`userId` 
        GROUP BY `conversation_id`  
        HAVING COUNT(IF(uc.`user_id` = 87, 1, NULL)) > 0) as conversation
JOIN ( SELECT `conversation_id` , MAX(`messageId`) as `messageId`
       FROM Messages1
       GROUP BY `conversation_id`) as last_message
  ON conversation.`conversation_id` = last_message.`conversation_id` 
JOIN Messages1 m
  ON m.`messageId` = last_message.`messageId`;

输出值

在此处输入图片说明

注意:我必须在表名上加1 ,因为在进行演示的平台上已经有一些表,无法删除它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM