MySQL Join - 排序数据,分组数据

MySQL Join - Sorting data, grouping data

我有两个 table:

推特用户 table

推特增长Table

我正在尝试加入这 2 个 table,从 twitteruser 中获取所有字段并从 twittergrowth 中获取选择性字段,然后仅从该数据中获取最后 3 行。

当前输出:

即行重复。我想要 ID 或用户名唯一的行,以及最后一组时间戳。所以这将是最后 3 行,它们具有最新的时间戳。

我可以乱写的代码是:

SELECT 
  t1.*,
  t2.new_followers_count,
  t2.new_friends_count,
  t2.new_timestamp     
FROM twitterusers t1 
JOIN twittergrowth t2 on (t1.username=t2.username)

搜索了很少 pages/sites,但无法真正弄清楚如何去做。我将不胜感激任何帮助。 :)

此外,我想在最终结果中添加一个 LIMIT 参数,以便我可以对完整结果进行分页。

您需要分组依据以达到您的预期输出。

GROUP BY id

要限制结果或将结果拆分为页面,您只需添加 LIMIT X,Y,其中 X 是起始记录,Y 是记录总数。

所以一个查询来提取你想要的预期结果,但只有前 10 个会像这样:

SELECT 
  t1.*,
  t2.new_followers_count,
  t2.new_friends_count,
  t2.new_timestamp     
FROM twitterusers t1 
JOIN twittergrowth t2 on t1.username=t2.username 
GROUP BY t1.id
LIMIT 0,10

首先,您需要在 twittergrowth table 中的相同 user_idusername 组中找到最大值 new_timestamp(最新)。这是一个经典的分组最大问题,子查询 tgmax 就是这样做的。然后你需要加入相同的table(这次是tg)以获取不在子查询的group by子句中且未在聚合函数(如max())中使用的其他列.这些列是 new_followers_countnew_friends_count

如果您尝试将它们放入子查询 mysql 的 select 中,将 return 来自同一组未指定行的值,并且不一定与具有最新的时间戳。这是解释 here.

一旦您获得 twittergrowth 所需的输出 table 唯一剩下的就是加入 twitterusers table 以获得所有其他列。

SELECT tu.*, tg.new_followers_count, tg.new_friends_count, tg.new_timestamp
FROM twitterusers tu
JOIN twittergrowth tg
  ON tu.user_id = tg.user_id AND tu.username = tg.username
JOIN 
  ( SELECT tgg.user_id, tgg.username, max(tgg.new_timestamp) as latest_timestamp 
    FROM twittergrowth tgg
    GROUP BY tgg.user_id, tgg.username ) tgmax
  ON tg.user_id = tgmax.user_id AND tg.username = tgmax.username
    AND tg.new_timestamp = tgmax.latest_timestamp

请注意,此查询将受益于 twittergrowth table 中 (user_id,username,new_timestamp) 的复合索引。