0

users、posts、users_posts の 3 つのテーブルを持つ MySQL データベースがあります。ユーザーと投稿の関係は多対多です。投稿のすべてのペアとそれらに共通するユーザー数のリストを取得するにはどうすればよいですか? 基本的に、投稿のリストと、両方にコメントしたユーザーの数が表示されます。ポイントは、データをネットワーク分析ソフトウェアにインポートする準備ができていることです。結果のリストはネットワーク用語で「エッジリスト」と呼ばれ、共通のユーザーはエッジの重みです。

スキーマ:

users
id
name

posts
id
title
body

users_posts
user_id
post_id

望ましい出力:

postname1         postname2     users_in_common
Here's a title    Title #2      2
Another post      Title #2      11

検索してみましたが、多対多、結合、3 つのテーブル、カウント、ペア、共有などの適切な検索用語さえ知りませんでした。

4

2 に答える 2

2

私のクエリは、一般的なユーザーのいないものを含む投稿のすべてのペアを生成します (そのような場合0users_in_commonは含まれます)。SQL Fiddleで私のソリューションを試すか、コードを参照してください。

select
    p1.title as postname1,
    p2.title as postname2,
    coalesce(s.users_in_common, 0) as users_in_common
from posts p1
    inner join posts p2 on p1.id < p2.id
    left join (
        select
            up1.post_id as post1_id,
            up2.post_id as post2_id,
            count(*) as users_in_common
        from users_posts up1, users_posts up2
        where up1.user_id = up2.user_id
            and up1.post_id < up2.post_id
        group by up1.post_id, up2.post_id
    ) s
    on (s.post1_id = p1.id and s.post2_id = p2.id)
order by p1.id, p2.id;
于 2012-06-06T17:36:05.963 に答える
0

これを試して

select
  p1.title as postname1,
  p2.title as postname2,
  (select count(*) from user_posts up where up.post_id in (p1.post_id, p2.post_id) as users_in_common
from
  posts p1, posts p2
于 2012-06-06T17:20:10.810 に答える