【问题标题】:SQL query with most recent name and total count具有最新名称和总数的 SQL 查询
【发布时间】:2022-10-15 09:42:40
【问题描述】:

我已经在 phpMyAdmin 上设置了一个表“table_one”,其中包含以下列:

  • USER_ID:不一致的用户 ID (message.author.id)
  • USER_NAME:不和谐的用户名(message.author.name)
  • USER_NICKNAME:用户在服务器上的显示名称(message.author.display_name)
  • TIMESTAMP:输入消息时的日期时间时间戳 (message.created_at)
  • MESSAGE CONTENT:用于成功完成内容的已清理输入关键字,仅在本示例中,将“apple”或“orange”视为两个目标关键字。

结果我想要的是一个视图或查询,它返回一个包含以下内容的表:

  • 用户最近的显示名称 (USER_NICKNAME),基于最近的时间戳
  • 用户输入特定关键字的总次数。例如将搜索限制为仅包括“apple”而不包括实例“orange”

我的意图是,如果用户输入了 10 次关键字,然后更改了他们的服务器昵称并再输入了 10 次相同的关键字,结果将显示他们最近的昵称,并且他们总共输入了 20 次关键字。

这是迄今为止我最接近我想要的结果。该查询正确地对用户根据静态不和谐 ID 更改其昵称的实例进行分组,但我希望它保留此功能,同时显示最新的 USER_NICKNAME 而不是 USER_ID:

SELECT USER_ID, COUNT(USER_ID)
FROM table_one
WHERE MESSAGE_CONTENT = 'apple'
GROUP BY USER_ID

【问题讨论】:

    标签: mysql discord.py


    【解决方案1】:

    我认为没有一种简单的方法可以做到这一点。在 Postgres 中,我会使用 SELECT DISTINCT ON 来获取昵称,但在 MySQL 中,我相信您仅限于 JOINing 分组查询。

    我会结合两个查询(或三个,取决于你如何看待它)。

    首先,要获取关键字计数,请使用您的原始查询:

    SELECT USER_ID, COUNT(USER_ID) as apple_count
        FROM table_one
        WHERE MESSAGE_CONTENT = 'apple'
        GROUP BY USER_ID;
    

    二、获取最后一个昵称,group by USER_ID没有子集的行并将结果用作JOIN 语句中的子查询:

    SELECT a.USER_ID, a.USER_NICKNAME AS last_nickname
    FROM table_one a
    INNER JOIN
        (SELECT USER_ID, MAX(TIMESTAMP) AS max_ts
         FROM table_one
         GROUP BY USER_ID) b
    ON a.USER_ID = b.USER_ID AND TIMESTAMP = max_ts
    

    然后我会JOIN 这两个,使用WITH 语句来增加正在发生的事情的清晰度:

    WITH
    nicknames AS 
        (SELECT a.USER_ID, a.USER_NICKNAME AS last_nickname
         FROM table_one a
         INNER JOIN
            (SELECT USER_ID, MAX(TIMESTAMP) AS max_ts
             FROM table_one
             GROUP BY USER_ID) b
         ON a.USER_ID = b.USER_ID AND TIMESTAMP = max_ts),
    counts AS
        (SELECT USER_ID, COUNT(USER_ID) AS apple_count
         FROM table_one
         WHERE MESSAGE_CONTENT = 'apple'
         GROUP BY USER_ID)
    SELECT nicknames.USER_ID, nicknames.last_nickname, counts.apple_count
    FROM nicknames
    INNER JOIN counts
    ON nicknames.USER_ID = counts.USER_ID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      相关资源
      最近更新 更多