5

この単純化された例で、同じテレビ番組のセットを楽しんでいるユーザーのペアを見つけようとしています

各ユーザーが楽しんでいる各テレビ番組のエントリを取得するテーブルがあるとします。

|USER | Show        |
|-----|-------------|
|001  | Lost        |
|001  | South Park  |
|002  | Lost        |
|003  | Lost        |
|003  | South Park  |
|004  | South Park  |
|005  | Lost        |
|006  | Lost        |

次に、次の結果が必要です。

|USER1 |USER2 |
|------|------|
|001   |003   |
|003   |001   |
|002   |005   |
|002   |006   |
|005   |002   |
|005   |006   |
|006   |002   |
|006   |005   |

または、さらに優れたバージョンは次のようになります。

|USER1 |USER2 |
|------|------|
|001   |003   |
|002   |005   |
|002   |006   |
|005   |006   |

基本的には、ユーザー 1 はユーザー 3 と同じ番組セットが好きです。

GROUP BY と JOIN で遊んでいますが、まだ答えが見つかりません:(。

これまでのところ、私は

SELECT s1.User as USER1, s2.User as USER2, s1.Show as Show 
FROM Shows s1 JOIN (SELECT * FROM Shows) s2 
ON s1.Shows=s2.Shows AND s1.User!=s2.User;

これにより、ユーザーのペアと、それらに共通するショーが生成されます。しかし、私はここからどこへ行くべきかわかりません。

4

2 に答える 2

4

表形式の結果の代わりに CSV を受け入れることができる場合は、単純にテーブルを 2 回グループ化できます。

SELECT GROUP_CONCAT(User) FROM (
  SELECT   User, GROUP_CONCAT(DISTINCT `Show` ORDER BY `Show` SEPARATOR 0x1e) AS s
  FROM     Shows
  GROUP BY User
) t GROUP BY s

それ以外の場合は、上記のサブクエリをそれ自体に結合できます。

SELECT DISTINCT LEAST(t.User, u.User) AS User1,
             GREATEST(t.User, u.User) AS User2
FROM (
  SELECT   User, GROUP_CONCAT(DISTINCT `Show` ORDER BY `Show` SEPARATOR 0x1e) AS s
  FROM     Shows
  GROUP BY User
) t JOIN (
  SELECT   User, GROUP_CONCAT(DISTINCT `Show` ORDER BY `Show` SEPARATOR 0x1e) AS s
  FROM     Shows
  GROUP BY User
) u USING (s)
WHERE t.User <> u.User

sqlfiddleでそれらを参照してください。

もちろん、重複する(User, Show)ペアがテーブルに存在しないことが保証されている場合は、集計からキーワードをShows削除することでパフォーマンスを向上させることができます。DISTINCTGROUP_CONCAT()

于 2012-10-10T16:25:22.947 に答える
0

これについてさらに考えた後、グループをグループ化するとどうなるか、

select
    group_concat( 
      User
      order by User
      separator ', '
      ) LikeViewers
  , Shows
from
(
select
      User
    , group_concat(
        concat('"', Show, '"')
        order by Show
        separator ', '
        ) Shows
  from
    Viewings
  group by
    User
) ViewerGroups
group by
  Shows

このような出力を生成します

|LikeViewers  |Shows               |
|-------------|--------------------|
|002, 005, 006|"Lost"              |
|001, 003     |"Lost", "South Park"|
|004          |"South Park"        |

確かに、結果はもっと再利用できるかもしれませんが、それは興味深いアイデアだと思いました。

ここでフィドル

于 2012-10-11T08:40:39.883 に答える