简体   繁体   English

MySQL-为每个用户选择最后一行

[英]Mysql - select last row for each user

this is my query : 这是我的查询:

 SELECT msgId as `ID`,msgFromUserId , msgToUserId ,  
            DATE_FORMAT( msgDate,'%d/%m/%y %H:%i') as `time` ,  MID(msgText,1,30) as `text` , 
            (CASE WHEN (msgFromUserId=292646) then  b.user_login else  a.user_login END) as `sender`
            FROM tbl_messages inner join wp_users as a on tbl_messages.msgFromUserId=a.ID 
            inner join wp_users as b on tbl_messages.msgToUserId=b.ID 
            inner join tbl_forum_users u1 on tbl_messages.msgFromUserId=u1.user_ID 
            inner join tbl_forum_users u2 on tbl_messages.msgToUserId=u2.user_ID 
where (msgFromUserId=292646 or msgToUserId=292646)
and tbl_messages.msgId in (SELECT max(msgId) FROM tbl_messages   GROUP BY msgFromUserId, msgToUserId )
order by msgId desc

i get this : 我得到这个:

结果表

I dont want duplication row. 我不想重复行。 Just get the last line of conversation between them 只是获得他们之间的最后对话

A fast fix could be to change your subquery 一种快速的解决方法是更改​​您的子查询

SELECT max(msgId) FROM tbl_messages   GROUP BY msgFromUserId, msgToUserId

to

SELECT max(msgId) 
FROM tbl_messages
GROUP BY LEAST(msgFromUserId, msgToUserId), GREATEST(msgFromUserId, msgToUserId)

This will group messages from 292646 to 1 and from 1 to 292646 together. 这会将来自292646到1以及从1到292646的消息分组在一起。

Complete query: 完整查询:

SELECT msgId as `ID`,msgFromUserId , msgToUserId ,  
            DATE_FORMAT( msgDate,'%d/%m/%y %H:%i') as `time` ,  MID(msgText,1,30) as `text` , 
            (CASE WHEN (msgFromUserId=292646) then  b.user_login else  a.user_login END) as `sender`
            FROM tbl_messages inner join wp_users as a on tbl_messages.msgFromUserId=a.ID 
            inner join wp_users as b on tbl_messages.msgToUserId=b.ID 
            inner join tbl_forum_users u1 on tbl_messages.msgFromUserId=u1.user_ID 
            inner join tbl_forum_users u2 on tbl_messages.msgToUserId=u2.user_ID 
where (msgFromUserId=292646 or msgToUserId=292646)
and tbl_messages.msgId in (
    SELECT max(msgId) 
    FROM tbl_messages
    GROUP BY LEAST(msgFromUserId, msgToUserId), GREATEST(msgFromUserId, msgToUserId)
)
order by msgId desc

To improve the performance you should also move the user-id-condition into the subquery: 为了提高性能,您还应该将user-id-condition移到子查询中:

SELECT max(msgId) 
FROM tbl_messages
where (msgFromUserId=292646 or msgToUserId=292646) -- <-- here
GROUP BY LEAST(msgFromUserId, msgToUserId), GREATEST(msgFromUserId, msgToUserId)

To use the indexes the best way you should use a UNION ALL optimisation. 要以最佳方式使用索引,应使用UNION ALL优化。 But this is going to look pretty complex: 但这看起来非常复杂:

SELECT max(msgId)
FROM (
    SELECT msgToUserId as otherUserId, max(msgId) as msgId
    FROM tbl_messages 
    WHERE msgFromUserId=292646 
    GROUP BY msgToUserId

    UNION ALL

    SELECT msgFromUserId as otherUserId, max(msgId) as msgId
    FROM tbl_messages 
    WHERE msgToUserId=292646 
    GROUP BY msgFromUserId
) sub
GROUP BY otherUserId

Note this is only the subquery to use in the WHERE clause ( tbl_messages.msgId in (...) ). 请注意,这只是在WHERE子句( tbl_messages.msgId in (...)使用的子查询。

This subquery can also be used as a derived table, so we can join it with tbl_messages : 该子查询也可以用作派生表,因此我们可以将其与tbl_messages结合tbl_messages

SELECT msgId as `ID`,
       msgFromUserId,
       msgToUserId,  
       DATE_FORMAT( msgDate,'%d/%m/%y %H:%i') as `time`,
       MID(msgText,1,30) as `text` , 
       (CASE WHEN (msgFromUserId=292646) then  b.user_login else  a.user_login END) as `sender`
FROM (
    SELECT max(msgId) as msgId
    FROM (
        SELECT msgToUserId as otherUserId, max(msgId) as msgId
        FROM tbl_messages 
        WHERE msgFromUserId=292646 
        GROUP BY msgToUserId
        UNION ALL
        SELECT msgFromUserId as otherUserId, max(msgId) as msgId
        FROM tbl_messages 
        WHERE msgToUserId=292646 
        GROUP BY msgFromUserId
    ) sub
    GROUP BY otherUserId
) sub
inner join tbl_messages on tbl_messages.msgId = sub.msgId
inner join wp_users as a on tbl_messages.msgFromUserId=a.ID 
inner join wp_users as b on tbl_messages.msgToUserId=b.ID 
inner join tbl_forum_users u1 on tbl_messages.msgFromUserId=u1.user_ID 
inner join tbl_forum_users u2 on tbl_messages.msgToUserId=u2.user_ID 
order by tbl_messages.msgId desc

You need the following indexes to support the subquery: 您需要以下索引来支持子查询:

tbl_messages(msgFromUserId, msgToUserId [, msgId])
tbl_messages(msgToUserId, msgFromUserId [, msgId])

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

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