我的数据库中有这个表(关注者)。
follower | following
---------|----------
1 |2
1 |4
1 |5
1 |6
1 |7
1 |8
2 |4
4 |6这为我的用户记录了所有的以下内容和追随者。我有这个查询,它不起作用。
SELECT following
FROM followers
WHERE follower
IN (SELECT following
FROM followers
WHERE follower = 2)
OR following IN (SELECT follower
FROM followers
WHERE following = 2)我正在尝试实现的是一个用户列表,该列表后面是用户"2“所关注的用户,并与用户"2”之后的用户列表合并。不包括所有已经被用户"2“关注的人。并根据它们与用户"2“的关系有多密切来排列。
理想情况下,我的数据输出应该是这样的(但不是自动按这个顺序):
suggested_users
---------------
6
1
5
7
8我其实不知道如何问这个问题,但我如何得到这些结果呢?
发布于 2013-06-16 05:53:09
如果您可以选择转储mysql,一些sql变体允许您使用递归查询获取树:
http://www.postgresql.org/docs/current/static/queries-with.html
如果不是,则有多种解决方案;通常是嵌套集或嵌套间隔:
http://en.wikipedia.org/wiki/Nested_set_model
http://en.wikipedia.org/wiki/Nested_intervals
(关于这两个问题,有很多问题。)
:Postgres的语句是什么?我可能会换,MySQL看起来有点软弱:P
未经测试,但它类似于:
with recursive tree (root, node) as (
select following as root, follower as node
from followers
union all
select tree.root, followers.follower
from followers
join tree on tree.node = followers.following
)
select * from tree where root = 2;优化后的版本如下所示:
with recursive tree (root, node) as (
select following as root, follower as node
from followers
where following = 2
union all
select tree.root, followers.follower
from followers
join tree on tree.node = followers.following
)
select * from tree;发布于 2013-06-16 06:02:42
这可以通过连接自身的followers表来完成。
试试这个:
SELECT f2.following suggested_users
FROM followers f1
INNER JOIN followers f2 ON f2.follower = f1.following
WHERE f1.follower = 2
GROUP BY f2.following
UNION
SELECT f3.follower suggested_users
FROM followers f3
WHERE f3.following = 2
GROUP BY f3.follower此查询的一般思想是:
f1.follower遵循f1.following和f1.following = f2.followerf2.follower遵循f2.following与
f3.follower遵循f3.following和f3.following = 2表连接将如下所示:
第一个子查询
f1.follower | f1.following = f2.follower | f2.following | suggested_users |
------------|----------------------------|--------------|-----------------|
2 |4 |6 | 6 |第二个子查询
f3.follower | f3.following | suggested_users |
------------|--------------|-----------------|
1 |2 |1 |https://stackoverflow.com/questions/17128194
复制相似问题