sql >> データベース >  >> RDS >> Mysql

MySQLの協調フィルタリング?

    テーブルを作成し、テストデータを挿入します:

    CREATE TABLE `ub` (
      `user_id` int(11) NOT NULL,
      `book_id` varchar(10) NOT NULL,
      PRIMARY KEY (`user_id`,`book_id`),
      UNIQUE KEY `book_id` (`book_id`,`user_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    insert into ub values (1, 'A'), (1, 'B'), (1, 'C');
    insert into ub values (2, 'A'), (2, 'B'), (2, 'C'), (2,'D');
    insert into ub values (3, 'X'), (3, 'Y'), (3, 'C'), (3,'Z');
    insert into ub values (4, 'W'), (4, 'Q'), (4, 'C'), (4,'Z');
    

    book_idによってテストデータをそれ自体に結合し、各user_idとターゲットuser_idと共通の本の数を保持する一時テーブルを作成します。

    create temporary table ub_rank as 
    select similar.user_id,count(*) rank
    from ub target 
    join ub similar on target.book_id= similar.book_id and target.user_id != similar.user_id
    where target.user_id = 1
    group by similar.user_id;
    
    select * from ub_rank;
    +---------+------+
    | user_id | rank |
    +---------+------+
    |       2 |    3 |
    |       3 |    1 |
    |       4 |    1 |
    +---------+------+
    3 rows in set (0.00 sec)
    

    user_idにはuser_id1と共通の3つがありますが、user_id3とuser_id4にはそれぞれ1つしかありません。

    次に、一時テーブル内のユーザーが持っている、ターゲットのuser_idの本と一致しないすべての本を選択し、ランク別に並べ替えます。同じ本が異なるユーザーのリストに表示される可能性があることに注意してください。そのため、一般的な本のランキングが高くなるように、各本のランキングを合計します。

    select similar.book_id, sum(ub_rank.rank) total_rank
    from ub_rank
    join ub similar on ub_rank.user_id = similar.user_id 
    left join ub target on target.user_id = 1 and target.book_id = similar.book_id
    where target.book_id is null
    group by similar.book_id
    order by total_rank desc;
    
    +---------+------------+
    | book_id | total_rank |
    +---------+------------+
    | D       |          3 |
    | Z       |          2 |
    | X       |          1 |
    | Y       |          1 |
    | Q       |          1 |
    | W       |          1 |
    +---------+------------+
    6 rows in set (0.00 sec)
    

    ブックZは2つのユーザーリストに表示されたため、1つのユーザーリストにのみ表示されたX、Y、Q、Wより上位にランク付けされました。ブックDは、ターゲットのuser_id1と共通する3つのアイテムを持つuser_id2のリストに表示されたため、最も効果的でした。




    1. 一重引用符を回避する衛生状態は、SQL ServerのSQLインジェクションによってどのように打ち負かされますか?

    2. WAMPサーバーでMySQLに接続するにはどうすればよいですか?

    3. SQL結合に同じ名前の2つの列が存在する場合に、1つのテーブル列から値を取得する方法

    4. Oracle SQL Developerでジョブをスケジュールする方法は?