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_id
和 username
组中找到最大值 new_timestamp
(最新)。这是一个经典的分组最大问题,子查询 tgmax
就是这样做的。然后你需要加入相同的table(这次是tg
)以获取不在子查询的group by子句中且未在聚合函数(如max())中使用的其他列.这些列是 new_followers_count
和 new_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)
的复合索引。
我有两个 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_id
和 username
组中找到最大值 new_timestamp
(最新)。这是一个经典的分组最大问题,子查询 tgmax
就是这样做的。然后你需要加入相同的table(这次是tg
)以获取不在子查询的group by子句中且未在聚合函数(如max())中使用的其他列.这些列是 new_followers_count
和 new_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)
的复合索引。