sql >> Databáze >  >> RDS >> Mysql

Kolaborativní filtrování v MySQL?

Vytvořte tabulku a vložte testovací data:

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');

Připojte testovací data k sobě pomocí book_id a vytvořte dočasnou tabulku pro každé user_id a počet knih, které má společné s cílovým 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)

Vidíme, že user_id má 3 společné s user_id 1, ale user_id 3 a user_id 4 mají každý pouze 1.

Dále vyberte všechny knihy, které mají uživatelé v dočasné tabulce a které neodpovídají knihám cílového user_id, a uspořádejte je podle pořadí. Všimněte si, že stejná kniha se může objevit v různých seznamech uživatelů, takže sečteme hodnocení pro každou knihu, takže běžné knihy získají vyšší hodnocení.

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)

Kniha Z se objevila ve dvou seznamech uživatelů, a tak byla umístěna nad X,Y,Q,W, které se objevily pouze v seznamu jednoho uživatele. Kniha D si vedla nejlépe, protože se objevila v seznamu user_id 2, který měl 3 položky společné s cílovým user_id 1.




  1. Jak nainstalovat nejnovější verzi Sqlite aar při používání Room On Android

  2. Zobrazení seznamu PostgreSQL

  3. oratop

  4. MacOSX:automatické spuštění mysql při spouštění