我有两个表,如下所示:-
用户(表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)
答案 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
。这是基于(最有效的)假设,即sender
和receiver
始终是不同的值。
答案 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