zhibo/debug_follow_rooms.sql

268 lines
8.8 KiB
MySQL
Raw Normal View History

2026-01-03 15:32:31 +08:00
-- 调试关注页面显示问题的 SQL 脚本
-- 用于排查为什么关注的主播直播间不显示
-- ============================================
-- 第一部分:查看基础数据
-- ============================================
-- 1. 查看所有用户(包括主播状态)
SELECT
uid,
nickname,
phone,
is_streamer,
streamer_level,
create_time
FROM eb_user
ORDER BY uid;
-- 2. 查看所有直播间
SELECT
id,
title,
uid as streamer_uid,
is_live,
view_count,
like_count,
online_count,
create_time,
started_at
FROM eb_live_room
ORDER BY create_time DESC;
-- 3. 查看所有关注记录
SELECT
id,
follower_id,
follower_nickname,
followed_id,
followed_nickname,
follow_status,
is_deleted,
create_time
FROM eb_follow_record
ORDER BY create_time DESC;
-- ============================================
-- 第二部分:关联查询 - 查看关注关系和直播间
-- ============================================
-- 4. 查看每个用户关注了哪些主播
SELECT
u.uid as user_id,
u.nickname as user_name,
COUNT(DISTINCT fr.followed_id) as following_count,
GROUP_CONCAT(DISTINCT fr.followed_nickname SEPARATOR ', ') as following_list
FROM eb_user u
LEFT JOIN eb_follow_record fr ON u.uid = fr.follower_id
AND fr.follow_status IN ('1', '关注')
AND fr.is_deleted = 0
GROUP BY u.uid, u.nickname
ORDER BY following_count DESC;
-- 5. 查看每个主播有多少粉丝
SELECT
u.uid as streamer_id,
u.nickname as streamer_name,
u.is_streamer,
COUNT(DISTINCT fr.follower_id) as fans_count,
GROUP_CONCAT(DISTINCT fr.follower_nickname SEPARATOR ', ') as fans_list
FROM eb_user u
LEFT JOIN eb_follow_record fr ON u.uid = fr.followed_id
AND fr.follow_status IN ('1', '关注')
AND fr.is_deleted = 0
WHERE u.is_streamer = 1
GROUP BY u.uid, u.nickname, u.is_streamer
ORDER BY fans_count DESC;
-- 6. 查看每个主播的直播间状态
SELECT
u.uid as streamer_id,
u.nickname as streamer_name,
u.is_streamer,
COUNT(DISTINCT lr.id) as room_count,
SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) as live_room_count,
GROUP_CONCAT(
DISTINCT CONCAT(lr.id, ':', lr.title, '(', IF(lr.is_live=1, '直播中', '未开播'), ')')
SEPARATOR ' | '
) as rooms_info
FROM eb_user u
LEFT JOIN eb_live_room lr ON u.uid = lr.uid
WHERE u.is_streamer = 1
GROUP BY u.uid, u.nickname, u.is_streamer
ORDER BY live_room_count DESC, room_count DESC;
-- ============================================
-- 第三部分:模拟关注页面的查询逻辑
-- ============================================
-- 7. 模拟某个用户的关注页面应该显示的内容
-- 替换 @USER_ID 为实际的用户ID
SET @USER_ID = 1;
-- 7.1 查看该用户关注了哪些人
SELECT
fr.followed_id as followed_user_id,
fr.followed_nickname,
u.is_streamer,
fr.follow_status,
fr.create_time as followed_at
FROM eb_follow_record fr
LEFT JOIN eb_user u ON fr.followed_id = u.uid
WHERE fr.follower_id = @USER_ID
AND fr.follow_status IN ('1', '关注')
AND fr.is_deleted = 0
ORDER BY fr.create_time DESC;
-- 7.2 查看该用户关注的主播中,哪些有直播间
SELECT
u.uid as streamer_id,
u.nickname as streamer_name,
lr.id as room_id,
lr.title as room_title,
lr.is_live,
lr.view_count,
lr.online_count,
lr.create_time as room_created_at,
lr.started_at as live_started_at
FROM eb_follow_record fr
INNER JOIN eb_user u ON fr.followed_id = u.uid AND u.is_streamer = 1
INNER JOIN eb_live_room lr ON u.uid = lr.uid
WHERE fr.follower_id = @USER_ID
AND fr.follow_status IN ('1', '关注')
AND fr.is_deleted = 0
ORDER BY lr.is_live DESC, lr.started_at DESC;
-- 7.3 查看该用户关注的主播中,哪些正在直播
SELECT
u.uid as streamer_id,
u.nickname as streamer_name,
u.avatar as streamer_avatar,
lr.id as room_id,
lr.title as room_title,
lr.cover_url,
lr.view_count,
lr.online_count,
lr.like_count,
lr.started_at as live_started_at,
TIMESTAMPDIFF(MINUTE, lr.started_at, NOW()) as live_duration_minutes
FROM eb_follow_record fr
INNER JOIN eb_user u ON fr.followed_id = u.uid AND u.is_streamer = 1
INNER JOIN eb_live_room lr ON u.uid = lr.uid AND lr.is_live = 1
WHERE fr.follower_id = @USER_ID
AND fr.follow_status IN ('1', '关注')
AND fr.is_deleted = 0
ORDER BY lr.started_at DESC;
-- ============================================
-- 第四部分:诊断问题
-- ============================================
-- 8. 检查是否有用户关注了主播但看不到直播间的情况
SELECT
'问题诊断' as diagnosis_type,
fr.follower_id,
u1.nickname as follower_name,
fr.followed_id,
u2.nickname as followed_name,
u2.is_streamer,
COUNT(lr.id) as room_count,
SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) as live_room_count,
CASE
WHEN u2.is_streamer = 0 THEN '被关注者不是主播'
WHEN COUNT(lr.id) = 0 THEN '主播没有创建直播间'
WHEN SUM(CASE WHEN lr.is_live = 1 THEN 1 ELSE 0 END) = 0 THEN '主播有直播间但未开播'
ELSE '正常:主播正在直播'
END as status_description
FROM eb_follow_record fr
LEFT JOIN eb_user u1 ON fr.follower_id = u1.uid
LEFT JOIN eb_user u2 ON fr.followed_id = u2.uid
LEFT JOIN eb_live_room lr ON u2.uid = lr.uid
WHERE fr.follow_status IN ('1', '关注')
AND fr.is_deleted = 0
GROUP BY fr.follower_id, u1.nickname, fr.followed_id, u2.nickname, u2.is_streamer
ORDER BY fr.follower_id, fr.followed_id;
-- 9. 检查直播间的 uid 字段是否正确关联到主播
SELECT
lr.id as room_id,
lr.title as room_title,
lr.uid as room_uid,
u.uid as user_uid,
u.nickname as user_nickname,
u.is_streamer,
CASE
WHEN lr.uid IS NULL THEN '直播间没有关联用户ID'
WHEN u.uid IS NULL THEN '直播间关联的用户不存在'
WHEN u.is_streamer = 0 THEN '直播间关联的用户不是主播'
ELSE '正常'
END as status
FROM eb_live_room lr
LEFT JOIN eb_user u ON lr.uid = u.uid
ORDER BY lr.create_time DESC;
-- 10. 检查关注状态字段的值分布
SELECT
follow_status,
COUNT(*) as count,
GROUP_CONCAT(DISTINCT CONCAT(follower_nickname, '->', followed_nickname) SEPARATOR '; ') as examples
FROM eb_follow_record
GROUP BY follow_status;
-- ============================================
-- 第五部分:修复建议
-- ============================================
-- 11. 如果发现关注状态值不一致,可以执行以下修复(谨慎执行)
-- 将字符串状态统一为数字
-- UPDATE eb_follow_record SET follow_status = '1' WHERE follow_status = '关注';
-- UPDATE eb_follow_record SET follow_status = '0' WHERE follow_status = '取消关注' OR follow_status = '0';
-- 12. 如果发现直播间的 uid 字段为空,需要修复
-- UPDATE eb_live_room lr
-- INNER JOIN eb_user u ON lr.streamer_name = u.nickname AND u.is_streamer = 1
-- SET lr.uid = u.uid
-- WHERE lr.uid IS NULL;
-- ============================================
-- 第六部分:测试数据插入(用于测试)
-- ============================================
-- 13. 创建测试用户和关注关系(如果需要)
-- 注意执行前请确认用户ID不冲突
-- 插入测试主播
-- INSERT INTO eb_user (uid, nickname, phone, is_streamer, streamer_level, create_time)
-- VALUES (100, '测试主播1', '13800000001', 1, 1, NOW());
-- 插入测试普通用户
-- INSERT INTO eb_user (uid, nickname, phone, is_streamer, create_time)
-- VALUES (101, '测试用户1', '13800000002', 0, NOW());
-- 插入关注记录
-- INSERT INTO eb_follow_record (follower_id, follower_nickname, followed_id, followed_nickname, follow_status, is_deleted, create_time)
-- VALUES (101, '测试用户1', 100, '测试主播1', '1', 0, NOW());
-- 插入测试直播间
-- INSERT INTO eb_live_room (title, uid, stream_key, is_live, view_count, online_count, create_time, started_at)
-- VALUES ('测试直播间', 100, 'test_stream_key_001', 1, 0, 0, NOW(), NOW());
-- ============================================
-- 第七部分:清理测试数据
-- ============================================
-- 14. 清理测试数据(如果需要)
-- DELETE FROM eb_live_room WHERE uid = 100;
-- DELETE FROM eb_follow_record WHERE follower_id = 101 OR followed_id = 100;
-- DELETE FROM eb_user WHERE uid IN (100, 101);
-- ============================================
-- 使用说明
-- ============================================
-- 1. 先执行第一部分和第二部分,查看基础数据
-- 2. 在第三部分中,将 @USER_ID 替换为实际的用户ID查看该用户应该看到的内容
-- 3. 执行第四部分,诊断可能的问题
-- 4. 根据诊断结果,参考第五部分的修复建议
-- 5. 如果需要测试,可以使用第六部分创建测试数据
-- 6. 测试完成后,使用第七部分清理测试数据