0

データベースにこのテーブル (フォロワー) があります。

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

この質問をする方法について実際には途方に暮れていますが、どうすればこれらの結果を得ることができますか?

4

2 に答える 2

2

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

(両方に関連するSOに関する多くの質問があります。)


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-15T21:53:09.460 に答える
0

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

このクエリの一般的な考え方は次のとおりです。

  1. f1.follower続きf1.followingf1.following = f2.follower
  2. f2.follower続くf2.following

と組み合わせ

  1. f3.follower続きf3.followingf3.following = 2

テーブルの結合は次のようになります。

最初のサブクエリ

f1.follower | f1.following = f2.follower | f2.following | suggested_users |
------------|----------------------------|--------------|-----------------|
2           |4                           |6             | 6               |

2 番目のサブクエリ

f3.follower | f3.following | suggested_users |
------------|--------------|-----------------|
1           |2             |1                |
于 2013-06-15T22:02:42.223 に答える