0

ユーザーインタレストタグなどのテーブルを含むデータベースがあります。

usersテーブルは次のようなものです。

user_id  |  name  |  city
   15       John     New York
   18       Helen    Virgina

インタレストテーブルは次のようなものです。

interest_id  |  user_id  |  tag_id
    1              15         23
    2              15         24
    3              15         25
    4              18         23
    5              18         27

タグテーブルは次のようなものです。

tag_id  |  description
   23        Skiing
   24        TV
   25        Movies
   26        Music
   27        Seinfeld

テーブルによると、ジョンとヘレンはどちらもスキーに興味を持っています。

JohnとHelenが1つの同様の関心を持っているため、次のようにエコーするSQLクエリを作成したいと思います。

Helen 1 interest<br />
Jack 2 interests<br />

これどうやってするの?

また、dbスキーマに関して他にもっと良い方法はありますか?

初心者として、私は周りを見回してさまざまな実装を試しましたが、成功することはできませんでした。

4

1 に答える 1

2

ユーザーが他のユーザーと共通する関心の数を数えるには:

SELECT u2.name, count(*)
FROM   interests AS i1 
       JOIN users AS u1 
         ON u1.user_id = i1.user_id 
       JOIN interests AS i2 
         ON i1.tag_id = i2.tag_id 
       JOIN users AS u2 
         ON u2.user_id = i2.user_id 
            AND u1.user_id <> u2.user_id 
       JOIN tags AS t 
         ON i1.tag_id = t.tag_id 
WHERE  u1.name = 'John'
GROUP BY u2.name; 

http://sqlfiddle.com/#!2/80aad/1

スキーマに関しては、users_tagsという名前の場合、junctionテーブルの方が理にかなっています。また、このスキーマではインタレストのid列は必要ありません。組み合わせ(user_id、tag_id)は主キーの自然な候補であり、とにかくそれにUNIQUEインデックスを設定する必要があります。

于 2013-03-16T16:10:04.283 に答える