-- 抖音所有账号,各自最近一条视频 + 标签 + 详细数据 -- -- 直接在 MySQL 5.7 里跑(生产库 mediacrawler_prod)。已实测:42 个账号,包含 -- **一条作品都没有的**(那些行的作品列是空的)—— 它们出现在列表里是有意的, -- 和界面上的作品栏一致。 -- -- 为什么写成这个形状: -- -- * **5.7 没有窗口函数**,ROW_NUMBER() 用不了。所以「每个博主最新那条」是用 -- 相关子查询 `ORDER BY published_at DESC LIMIT 1` 挑的,而不是 rank 之后取 1。 -- * 账号清单取的是 **作品里出现过的 ∪ 有账号资料的**(`UNION` 去重)。只从作品里取 -- 的话,那些「加了目标、也采到了粉丝数、但一条作品都没有」的号会整行消失。 -- * 「最新」按 **published_at**(作者发布时间)排,不是 last_seen_at。降级路径 -- (作品列表被风控挡住)会把所有已知作品都刷一遍,那时 last_seen_at 全都一样, -- 按它排等于没排。 -- * 指标取**最近一轮**(run_id 最大)的快照。注意抖音作品目前没有 published_at -- 为空的,所以不存在「没有日期的作品排哪儿」的问题。 -- -- 只想看某一个任务的话,把四处 `t.platform = 'dy'` 换成对应的 task_id,例如: -- WHERE t1.id = 7 -- (四处指的是:账号清单里两处、最新作品子查询一处、账号快照子查询一处。) SELECT acct.creator_hash AS 博主哈希, ca.alias AS 博主备注, COALESCE(st.nickname, n.creator_name, '') AS 博主昵称, st.fans AS 粉丝数, st.total_favorited AS 总获赞, st.works_count AS 主页作品数, n.note_id AS 作品ID, n.title AS 作品标题, n.note_url AS 作品链接, FROM_UNIXTIME(n.published_at / 1000) AS 发布时间, m.liked_count AS 点赞, m.comment_count AS 评论, m.collected_count AS 收藏, m.share_count AS 分享, (SELECT GROUP_CONCAT(t.name ORDER BY t.sort_order SEPARATOR ' / ') FROM monitor_note_tag nt JOIN monitor_tag t ON t.id = nt.tag_id WHERE nt.platform = 'dy' AND nt.note_id = n.note_id) AS 标签, (SELECT na.alias FROM monitor_note_alias na WHERE na.platform = 'dy' AND na.note_id = n.note_id LIMIT 1) AS 作品备注 FROM ( -- 账号清单:作品里出现过的 SELECT n1.creator_hash FROM monitor_note n1 JOIN monitor_task t1 ON t1.id = n1.task_id WHERE t1.platform = 'dy' UNION -- ∪ 有账号资料的(包含一条作品都没有的博主) SELECT s1.creator_hash FROM monitor_creator_stat s1 JOIN monitor_task t2 ON t2.id = s1.task_id WHERE t2.platform = 'dy' ) acct -- 这个博主最新的一条作品 LEFT JOIN monitor_note n ON n.id = (SELECT n2.id FROM monitor_note n2 JOIN monitor_task t3 ON t3.id = n2.task_id WHERE t3.platform = 'dy' AND n2.creator_hash = acct.creator_hash ORDER BY n2.published_at DESC, n2.id DESC LIMIT 1) -- 那条作品最近一轮的指标 LEFT JOIN monitor_note_metric m ON m.id = (SELECT m2.id FROM monitor_note_metric m2 WHERE m2.task_id = n.task_id AND m2.note_id = n.note_id ORDER BY m2.run_id DESC LIMIT 1) LEFT JOIN monitor_creator_alias ca ON ca.platform = 'dy' AND ca.creator_hash = acct.creator_hash -- 博主最近一轮的账号级指标 LEFT JOIN monitor_creator_stat st ON st.id = (SELECT s2.id FROM monitor_creator_stat s2 JOIN monitor_task t4 ON t4.id = s2.task_id WHERE t4.platform = 'dy' AND s2.creator_hash = acct.creator_hash ORDER BY s2.run_id DESC LIMIT 1) ORDER BY st.fans DESC, acct.creator_hash