代码之家  ›  专栏  ›  技术社区  ›  Quatban Taco

SQL查询:使用SQL连接对最新消息进行分组

  •  0
  • Quatban Taco  · 技术社区  · 7 年前

    我正在试图找回 最近的 关于的消息 每个 使用SQL从不同用户发布。我有3张桌子:

    • 用户表(用于收集用户信息)
    • Post表格(收集Post信息)
    • 消息表(包含消息的表)

    然而,我的SQL语法出现了一个错误,下面是代码

    SELECT
       MAX(sequence) AS latestmsg,
       COUNT(*) AS msgcount,
       sequence,
       messageid,
       username,
       receipient,
       message,
       datestamp 
    FROM
       messages 
       JOIN
          users 
          ON messages.username = users.username 
       JOIN
          posts 
          ON posts.postid = messages.messageid 
    WHERE
       messages.receipient = 'try-2a' 
    GROUP BY
       messages.messageid 
    ORDER BY
       messages.sequence DESC
    

    错误:字段列表中的“用户名”列不明确

    Link to Fiddle with Schema

    3 回复  |  直到 7 年前
        1
  •  2
  •   Eric    7 年前
    SELECT
           MAX(sequence) AS latestmsg,
           COUNT(*) AS msgcount,
           sequence,
           messageid,
           users.username,
           receipient,
           message,
           datestamp 
        FROM
           messages 
           JOIN
              users 
              ON messages.username = users.username 
           JOIN
              posts 
              ON posts.postid = messages.messageid 
        WHERE
           messages.receipient = 'try-2a' 
        GROUP BY
           messages.messageid 
        ORDER BY
           messages.sequence DESC
    

    尝试以下修改的查询:

    SELECT sequence AS latestmsg,
        msgcount,
        sequence,
        messages.messageid,
        users.username,
        receipient,
        message,
        messages.datestamp 
    FROM messages 
    JOIN users ON messages.username = users.username 
    JOIN posts ON posts.postid = messages.messageid 
    JOIN (
        SELECT messageid, MAX(sequence) AS max_seq, COUNT(*) AS msgcount
        FROM messages
        GROUP BY messageid
    ) m ON m.messageid = messages.messageid AND m.max_seq = messages.sequence
    WHERE messages.receipient = 'try-2a' 
    ORDER BY messages.sequence DESC
    
        2
  •  0
  •   digital.aaron    7 年前

    这个 username 中的列 SELECT 列表需要加上表别名的前缀,因为 用户名 两者都存在 messages users

    SELECT
       MAX(sequence) AS latestmsg,
       COUNT(*) AS msgcount,
       sequence, 
       messageid,
       username, --This column needs to have the alias prefix
       receipient,
       message,
       datestamp 
    
        3
  •  0
  •   argoc    7 年前

    如果您试图查找每个用户的最新消息,则需要按用户分组,然后查找每个用户组中每个消息的最大时间戳。您可以使用它来选择时间戳与其匹配的消息。