【问题标题】:MySQL grouping and getting newest rowsMySQL分组并获取最新行
【发布时间】:2013-09-14 08:25:13
【问题描述】:

我想获得列中的最新行,但我需要在将它们彼此分组之前获取它们。如果我在 group by 之后放置 Order by,mysql 将它们排序在它们之前分组。

我尝试做的是,将用户的最后一条消息相互分组(如 facebook 聊天。)

如果客户有 3 个对话,他/她需要将消息列表作为最后一个对话:

(假设,移动用户昵称是 Rob,他正在列出他的消息历史......)

Rob -> Thomas(你好,我会尽快回来。)

Dyne -> Rob(你在哪里?)

Rob -> Danilla(你好吗?)

SELECT 
    u.userNickName, 
    u.userFBID, 
    m.didRead, 
    max(m.messageID) messageID, 
    m.messageContent, 
    m.srcUserID, 
    m.destUserID, 
    m.messageSendDate
FROM 
users u, messages m
WHERE
(m.srcUserID='122' || m.destUserID ='122')
AND
u.userID =  m.destUserID
GROUP BY
u.userNickName

【问题讨论】:

    标签: mysql groupwise-maximum


    【解决方案1】:

    您要查找的不是 group 而是 LIMIT - 您可以根据日期以 desc 顺序对结果进行排序,并将结果集限制为包含最后 3 条消息:

    SELECT 
        u.userNickName, 
        u.userFBID, 
        m.didRead, 
        max(m.messageID) messageID, 
        m.messageContent, 
        m.srcUserID, 
        m.destUserID, 
        m.messageSendDate
    FROM 
    users u, messages m
    WHERE
    (m.srcUserID='122' || m.destUserID ='122')
    AND
    u.userID =  m.destUserID
    ORDER BY m.messageSendDate DESC
    LIMIT 3
    

    【讨论】:

    • 无论谁发给那条消息,结果都是3条消息,我的意思是如果前2条消息属于Rob-Thomas,用户将看不到其他消息。
    • @InnaKamoze 此答案指的是您提出的问题,如果您有其他限制 - 请通过相关示例将其合并到您的问题中。
    • 我刚刚尝试了你的 sql,它按我说的那样工作。它只是获取 3 行,没有按用户分类...
    • 您从未在您的问题中定义“按用户分类”的要求,此外,您没有通过m.destUserID 解释如何做到这一点?通过m.srcUserID?通过另一个参数?如果您需要更多帮助,则必须提供更多详细信息、表中几行的示例以及理想情况下您希望作为查询输出的内容。如果没有这些额外的信息,就不可能猜出您想要实现的目标......
    • 我写道:“我试图做的是,为用户的最后一条消息分组消息(如 Facebook 聊天。)”。另外:Rob -> Thomas(你好,我会尽快回来。) Dyne -> Rob(你在哪里?) Rob -> Danilla(你好吗?)顺便说一句。在这种情况下,Rob 就是我。我想按最后一条消息的顺序列出每一行中的每个用户消息。例如:如果我们进行了对话,并且如果我给你发了最后一条消息,Sql 应该得到我们的最后一条对话消息和其他对话,情况相同......
    【解决方案2】:

    我通过以下 SQL 语句使用子查询和分组解决了我的问题:

    SELECT 
        u.userNickName,
        u.userFBID,
        m.didRead,
        m.messageID,
        m.messageContent,
        m.srcUserID,
        m.destUserID,
        m.messageSendDate 
    FROM 
        users u, 
        messages m 
    WHERE 
        (u.userID = m.srcUserID or u.userID = m.destUserID) 
    AND 
    CASE 
        WHEN m.srcUserID='122' THEN u.userID= m.destUserID
        WHEN m.destUserID ='122' THEN u.userID= m.srcUserID
        ELSE -1
    END 
    AND 
    m.messageID in (select max(m.messageID) from users u, messages m where (u.userID = m.srcUserID or u.userID = m.destUserID) group by u.userNickName);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多