1

この質問の言い方すらわかりませんでした。サンプルコンテンツと必要な出力を提供します。これを行うためのクエリを探しています。

このコンテンツで「フラグ付き」というテーブルがあるとしましょう。

content_id | user_id
1          | 1
1          | 2
1          | 3
2          | 1
2          | 3
2          | 4
3          | 2
3          | 3
4          | 1
4          | 2
5          | 1
6          | 1
6          | 4

そして、私はcontent_ids間に非対称の関係を持っています:

master_content_id | slave_content_id
1                 | 2
3                 | 4
5                 | 6

「マスター」content_id(1、3、5)ごとに、マスターコンテンツまたはスレーブコンテンツのいずれかにフラグを立てた個別のユーザーの数をカウントしたいのですが、両方を単一のフラグとしてフラグを立てたユーザーをカウントします。つまり、上記の例では、content_id = 1は、user_id = 1(content_id=1およびcontent_id=2として)、user_id = 2(content_id = 1として)、user_id = 3(content_id=1およびcontent_id=2として)、およびuser_idによってカウントされました。 = 4(content_id = 2として!)

私が作成したいクエリの出力の例は次のとおりです。

content_id | user_count
1          | 4          # users 1, 2, 3, 4
3          | 3          # users 1, 2, 3
5          | 2          # users 1, 4

関連するcontent_idsが常に連続した奇数/偶数であるとは想定できません(つまり、66はスレーブ58のマスターになることができます)

私はMySQLを使用しており、SQLの拡張機能を使用してもかまいません(クエリはANSIであるか、少なくともほとんどのデータベースに移植可能です)

4

4 に答える 4

3

以下のクエリは私のために働いた。

UNION ALLマップされたコンテンツを直接のコンテンツと同じように扱うために、サブクエリを使用しています。

SELECT master_content_id AS content_id,
       COUNT(DISTINCT user_id) AS user_count
FROM (
  SELECT master_content_id, slave_content_id
    FROM relationship
  UNION ALL
  SELECT master_content_id, master_content_id
    FROM relationship
) r
JOIN flagged f ON ( f.content_id = r.slave_content_id )
GROUP BY master_content_id

結果:

content_id  user_count
         1           4
         3           3
         5           2
于 2012-05-03T10:18:51.503 に答える
2

このようなものがあなたのために働くと思います(GROUP_CONCATMySQL固有ですが、他のRDBMSでも同様の連結を実現できます)

SELECT  COALESCE(Master_Content_ID, Content_ID) AS Content_ID,
        COUNT(DISTINCT User_ID) AS Users,
        CONCAT('#Users ', GROUP_CONCAT(DISTINCT User_ID ORDER BY User_ID)) AS UserList
FROM    Flagged
        LEFT JOIN MasterContent
            ON Content_ID = Slave_Content_ID
GROUP BY COALESCE(Master_Content_ID, Content_ID)

ここにサンプルSQLフィドル:http ://www.sqlfiddle.com/#!2 / d09be / 2

出力:

CONTENT_ID  USERS   USERLIST
1           4       #Users 1,2,3,4
3           3       #Users 1,2,3
5           2       #Users 1,4
于 2012-05-03T10:25:22.230 に答える
1

与えられたサンプルから、これは仕事をしますか(私はテストに利用できるMySQLを持っていません)?

SELECT 
    ms.master_content_id,
    (SELECT COUNT(DISTINCT f.user_id) FROM flagged f WHERE
                      f.content_id = ms.slave_content_id OR
                      f.content_id = ms.master_content_id)
FROM
    master_slave ms

DISTINCTがない方がいいのですが、それを回避する方法がわかりません。

于 2012-05-03T10:24:59.410 に答える
1
SELECT master_content_id      AS content_id
     , COUNT(*)               AS user_count
     , GROUP_CONCAT(user_id)  AS flagging_users
FROM 
  ( SELECT r.master_content_id 
         , f.user_id
    FROM relationship AS r
      JOIN flagged AS f
        ON f.content_id = r.master_content_id
  UNION 
    SELECT r.master_content_id
         , f.user_id
    FROM relationship AS r
      JOIN flagged AS f
        ON f.content_id = r.slave_content_id
  ) AS un
GROUP BY master_content_id
于 2012-05-03T10:34:28.640 に答える