sql >> Database teknologi >  >> RDS >> Mysql

Samarbejdsfiltrering i MySQL?

Opret en tabel og indsæt testdataene:

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

Føj testdataene til sig selv ved hjælp af book_id, og opret en midlertidig tabel til at indeholde hvert user_id og antallet af bøger, det har til fælles med target 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)

Vi kan se, at user_id har 3 til fælles med user_id 1, men user_id 3 og user_id 4 har kun 1 hver.

Dernæst skal du vælge alle de bøger, som brugerne i den midlertidige tabel har, som ikke matcher target user_id's bøger, og arrangere disse efter rang. Bemærk, at den samme bog kan forekomme på forskellige brugeres lister, så vi summerer rangeringen for hver bog, så almindelige bøger får en højere placering.

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)

Bog Z optrådte i to brugerlister, og blev derfor rangeret over X,Y,Q,W, som kun optrådte på én brugers liste. Bog D klarede sig bedst, fordi den optrådte i user_id 2's liste, som havde 3 elementer til fælles med target user_id 1.




  1. forespørgsel til vandret layout af mysql-data

  2. LEFT() vs SET TEXTSIZE i SQL Server:Hvad er forskellen?

  3. SQL Server navngivet instans med Visual Studio 2017 Installer-projekt

  4. Hvad er forskellen mellem REFERENCER med eller uden en UDENLANDSKE NØGLE