求一sql:新浪微博中的‘关注’查询

用过新浪微博的用户都知道‘关注’功能,实际上就是订阅
在登录用户A查询‘我的关注’时,可以知道对方是否也关注了A用户,这个sql怎么来写?
下面是模仿‘我的关注’列表,
[code="java"]曾子墨 取消关注
张学友 互相关注/取消关注
谭咏麟 互相关注/取消关注[/code]

我的表结构是这样的
[code="java"]Microblog_user(id, username)
microblog_sub(pub_id, sub_id) //这两个字段都是Microblog_user.id的外键[/code]

怎样写sql查询出‘我的关注列表’?

另外直觉告诉我们表结构可能有问题,调整表结构可能更好

5个回答

我理解为pub_id 是user,sub_id为订阅者,如理解错了 lz可以把下面的两个互换名称就可以了
[code="sql"]
select
Microblog_user.username, a.sub_id, b._subid
from Microblog_user
left join microblog_sub a on Microblog_user.id = a.pub_id
left join microblog_sub b on b.pub_id = a.sub_id and b.sub_id = Microblog_user.id [/code]

前两列肯定有值
第三列 如果有值证明是“互相关注” 没有值则表明user未被当前关注者关注

1)在microblog_sub加一字段interactive, bit型,默认值为0,用触发器更新,不影响原来结构。
2)select a.username, (case b.interactive when 1 then 'true' else 'false' end) as interactive from microblog_user a join microblog_sub b on a.id = b.pub_id;
--这样减少了1次表的检索

[code="sql"]
SELECT MUS.ID,MUS.USERNAME FORM (
SELECT MS.sub_id as sub_id
FROM Microblog_user MU JOIN microblog_sub MS
ON MU.ID=MS.PUB_ID
WHERE MU.ID='登录用户.ID' ) MS2
JOIN Microblog_user MUS
ON MUS.ID=MS2.sub_id
-- 此句增加提高效能 走index WHERE MUS.ID='登录用户.ID'

[/code]

上面的最后一个注释去掉..
[code="java"]
SELECT MUS.ID,MUS.USERNAME FORM (

SELECT MS.sub_id as sub_id

FROM Microblog_user MU JOIN microblog_sub MS

ON MU.ID=MS.PUB_ID

WHERE MU.ID='登录用户.ID' ) MS2

JOIN Microblog_user MUS

ON MUS.ID=MS2.sub_id

[/code]

如果你保证microblog_sub表中的sub_id肯定会在Microblog_user这张表有记录的话.
也可以用
[code="java"]
SELECT B.ID,B.USERNAME FROM
microblog_sub A JOIN Microblog_user B
ON A.sub_id=B.ID
WHERE A.pub_id='登录用户.ID'

[/code]

我原本想 create trigger trigger_insert_microblog_sub after insert on microblog_sub for each row begin update microblog_sub set interactive = 1 where (pub_id in (new.pub_id,new.sub_id) and sub_id in(new.sub_id,new.pub_id) or (
pub_id in(new.sub_id,new.pub_id) and sub_id in(new.pub_id,new.sub_id)));

但是,实际上这是不成功的。 (insert into microblog_sub values (4,3,0);
ERROR 1442 (HY000): Can't update table 'microblog_sub' in stored function/trigger because it is already used by
statement which invoked this stored function/trigger.)

不能依赖触发器来更新了(即使用set new.interactive =1 也最多只能更新一条数据。)
建议在insert,delete时候,自己再追加1条update语句好了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问