sql >> Database >  >> RDS >> Mysql

Collaboratief filteren in MySQL?

Maak een tabel en voer de testgegevens in:

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

Voeg de testgegevens toe aan zichzelf door book_id, en maak een tijdelijke tabel voor elke user_id en het aantal boeken dat het gemeen heeft met het doel 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)

We kunnen zien dat user_id 3 gemeen heeft met user_id 1, maar user_id 3 en user_id 4 hebben er elk maar 1.

Selecteer vervolgens alle boeken die de gebruikers in de tijdelijke tabel hebben die niet overeenkomen met de boeken van de beoogde user_id, en rangschik deze op rang. Houd er rekening mee dat hetzelfde boek in de lijsten van verschillende gebruikers kan verschijnen, dus we tellen de ranglijsten voor elk boek op, zodat gewone boeken een hogere rangorde krijgen.

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)

Boek Z verscheen in twee gebruikerslijsten en werd dus gerangschikt boven X,Y,Q,W, dat slechts in één gebruikerslijst verscheen. Boek D deed het het beste omdat het verscheen in de lijst van user_id 2, die 3 items gemeen had met doel user_id 1.




  1. Door de gebruiker ingevoerde tekst efficiënt opschonen

  2. Mysql:optimalisatie van het vinden van superknooppunten in geneste setstructuur

  3. Tel hoeveel rijen dezelfde waarde hebben

  4. 3 gebieden die baat zullen hebben bij het gebruik van een SQL Server Performance Monitoring Tool