你好说我有一个例子
我的关注表
A B
1 2 // same so its friend
2 1 // same so its a friend
1 3 // user 1 is following 3
1 4 // user 1 is following 4
等
让我们说我们是用户1我们如何列出我们的朋友? 我脑子里有点像
SELECT COUNT(*) FROM social WHERE ((A = B) = (B = A)) as friends
// so it will be something like count friends where ( 1 = 2 ) = ( 1 = 2) if you get my logic
或者我们能以某种方式这样做吗?
如果有效,它将计为1
答案 0 :(得分:5)
这应该这样做:
SELECT COUNT(me.A) FROM social AS me
INNER JOIN social AS you ON me.B = you.A
WHERE me.A = you.B AND me.A = 1
如果您想要朋友列表,请删除COUNT
。
修改强>
根据要求,解释。
你是JOIN
自己的表,因为你对行之间的关系感兴趣。
我决定将这些表别名为me
和you
,以使关系清晰明了。这就是说A
列可以将我称为关注者或您作为关注者。列B
指的是 followee
如果要重命名列,查询会更清楚地读取
if A
- > follower
和B
- > followee
,我们有:
SELECT COUNT(me.follower) FROM social AS me
INNER JOIN social AS you ON me.followee = you.follower
WHERE me.follower = you.followee AND me.follower = 1
所以它说,取这个表的两个副本,JOIN
me
中的跟随者是you
中的关注者的行。然后,过滤并仅显示me
中的关注者是you
中的关注者的行... ...通过捕获您希望拥有(A == B) && (B == A)
也许表别名不是那么好,但我希望澄清一点。
第二次编辑 根据以下评论,更清晰的形式可能是:
SELECT COUNT(me.A) FROM social AS me
INNER JOIN social AS you ON me.A = you.B AND me.B = you.A
WHERE me.A = 1