2017-03-05 56 views
0

這是我的查詢:MySQL的 - 選擇最後一排爲每個用戶

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 

我得到這個:

result table

我不想重複行。只是讓他們之間的談話

+0

你能做的就是'訂單DESC'你從'last到first'的順序獲得行,然後'LIMIT 1',你得到唯一的最後一行,即。第一行 – Alen

+0

您是否對錶和列定義有嚴重問題?記錄107和26具有相同的發送者。當有其他'FromUserId'時它不應該改變嗎? – Whencesoever

+0

你爲什麼加入'tbl_forum_users'?你在哪裏使用'u1'和'u2'? –

回答

2

快速修復可能會改變你的子查詢

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

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

這將組消息從292646到1和從1到292646的最後一行一起。

完整的查詢:

​​

爲了提高性能,你也應該將用戶ID條件爲子查詢:

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

要使用索引,你應該使用的最佳方法UNION ALL優化。但是,這會看起來非常複雜:

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 

注意,這只是在WHERE子句(tbl_messages.msgId in (...))中使用子查詢。

此子查詢也可以用來作爲派生表,所以我們可以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 

您需要以下指標來支持子查詢:

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