Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Kollaboratives Filtern in MySQL?

Erstellen Sie eine Tabelle und fügen Sie die Testdaten ein:

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

Verbinden Sie die Testdaten durch book_id mit sich selbst und erstellen Sie eine temporäre Tabelle, die jede user_id und die Anzahl der Bücher enthält, die sie mit der Ziel-user_id gemeinsam hat:

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)

Wir können sehen, dass user_id 3 mit user_id 1 gemeinsam hat, aber user_id 3 und user_id 4 haben jeweils nur 1.

Wählen Sie als Nächstes alle Bücher der Benutzer in der temporären Tabelle aus, die nicht mit den Büchern der Ziel-user_id übereinstimmen, und ordnen Sie diese nach Rang an. Beachten Sie, dass das gleiche Buch möglicherweise in den Listen verschiedener Benutzer erscheint, daher summieren wir die Platzierungen für jedes Buch, sodass gemeinsame Bücher eine höhere Platzierung erhalten.

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)

Buch Z erschien in zwei Benutzerlisten und wurde daher über X, Y, Q, W eingestuft, die nur in einer Benutzerliste auftauchten. Buch D schnitt am besten ab, da es in der Liste von user_id 2 auftauchte, die drei Einträge mit Ziel user_id 1 gemeinsam hatte.