使用单个查询从多个数据库中获取多个记录

时间:2019-04-09 13:43:30

标签: mysql

我有两个表,如下所示:-

用户(表1)

id name email     passs
1  u1   uemail1   pass1
2  u2   uemail2   pass2
3  u3   uemail3   pass3
4  u4   uemail4   pass4

消息(表2)

mess_id sender receiver message_text  send_time
1        1     2        text1         2019-03-25 09:39:05
2        1     2        text2         2019-03-30 15:10:54  
3        1     3        text3         2019-03-30 15:11:59
4        1     4        text4         2019-03-30 15:12:48
5        1     4        text5         2019-03-30 15:13:53
6        4     1        text6         2019-04-09 09:26:53

已登录的用户是u1,我想获得最新的对话,这是第六次。

现在,我要查找的是u1及其与谁的最新对话,然后从u1与之进行最新对话的其他用户的用户表中查找详细信息

希望您能回答我的问题,并且大家都清楚。

我怎样才能完成所有这1个查询

结果将是其他用户的详细信息,在上述情况下,用户将是u4

id name email     passs
4  u4   uemail4   pass4

到目前为止,我已经尝试过了,但是没有得到我想要的结果

select name from users where id=(select receiver_id,sender_id from messages where receiver_id or sender_id=1 order by send_time desc limit 1)

2 个答案:

答案 0 :(得分:1)

一种方法是确定派生表中的另一个用户ID,然后将其连接到用户表以获取用户详细信息。

SELECT 
  u.* 
FROM 
  user AS u 
JOIN 
(
  SELECT
    IF(sender <> 1, sender, receiver) AS other_user  /*Logged-in User Id is mentioned here */
  FROM messages 
  WHERE sender = 1 OR receiver = 1  /*Logged-in User Id is mentioned here */
  ORDER BY send_time DESC LIMIT 1   /*Get the latest message row */
) AS dt ON dt.other_user = u.id

IF(sender <> 1, sender, receiver)确定其他用户ID。如果sender不是 1 (已登录用户),则我们将sender视为其他用户,否则认为receiver。这是基于(最有效的)假设,即senderreceiver始终是不同的值。

答案 1 :(得分:1)

这是解决问题的一种比较复杂但非常笼统的方法。它在派生表中找到每个用户的最大发送/接收时间,然后function monitorCount(rows, columns) { return rows * columns; } function costOfMonitors(rows, columns){ return monitorCount(rows, columns) * 200; const totalCost = costOfMonitors(5, 4); } console.log(totalCost); JOIN表中查找与该消息相关的其他用户,然后messages s再次在JOIN表中查找该用户的详细信息。在查询末尾的users子句中指定感兴趣的用户。

WHERE

输出:

SELECT u2.*
FROM users u1
JOIN (SELECT user, MAX(send_time) AS send_time
      FROM (SELECT sender AS user, MAX(send_time) AS send_time
            FROM messages
            GROUP BY sender
            UNION
            SELECT receiver, MAX(send_time)
            FROM messages
            GROUP BY receiver) mt
      GROUP BY user) mt ON mt.user = u1.id
LEFT JOIN messages m1 ON m1.sender = mt.user AND m1.send_time = mt.send_time
LEFT JOIN messages m2 ON m2.receiver = mt.user AND m2.send_time = mt.send_time
JOIN users u2 ON u2.id = COALESCE(m1.receiver, m2.sender)
WHERE u1.id = 1

Demo on dbfiddle