首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中选择层级数据

问在MySQL中选择层级数据
EN

Stack Overflow用户
提问于 2013-06-16 05:44:46
回答 2查看 62关注 0票数 0

我的数据库中有这个表(关注者)。

代码语言:javascript
复制
follower | following
---------|----------
1        |2
1        |4
1        |5
1        |6
1        |7
1        |8
2        |4
4        |6

这为我的用户记录了所有的以下内容和追随者。我有这个查询,它不起作用。

代码语言:javascript
复制
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“的关系有多密切来排列。

理想情况下,我的数据输出应该是这样的(但不是自动按这个顺序):

代码语言:javascript
复制
suggested_users
---------------
6
1
5
7
8

我其实不知道如何问这个问题,但我如何得到这些结果呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

未经测试,但它类似于:

代码语言:javascript
复制
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;

优化后的版本如下所示:

代码语言:javascript
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2013-06-16 06:02:42

这可以通过连接自身的followers表来完成。

试试这个:

代码语言:javascript
复制
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

此查询的一般思想是:

  1. f1.follower遵循f1.following和f1.following = f2.follower

  1. f2.follower遵循f2.following

与

  1. f3.follower遵循f3.following和f3.following = 2

表连接将如下所示:

第一个子查询

代码语言:javascript
复制
f1.follower | f1.following = f2.follower | f2.following | suggested_users |
------------|----------------------------|--------------|-----------------|
2           |4                           |6             | 6               |

第二个子查询

代码语言:javascript
复制
f3.follower | f3.following | suggested_users |
------------|--------------|-----------------|
1           |2             |1                |
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17128194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档