एक टेबल बनाएं और टेस्ट डेटा डालें:
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_id 1 के साथ 3 समान हैं, लेकिन user_id 3 और user_id 4 में से प्रत्येक में केवल 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 दो उपयोगकर्ता सूचियों में दिखाई दी, और इसलिए इसे X, Y, Q, W से ऊपर स्थान दिया गया जो केवल एक उपयोगकर्ता की सूची में दिखाई दिया। पुस्तक D ने सबसे अच्छा प्रदर्शन किया क्योंकि यह user_id 2 की सूची में दिखाई दी, जिसमें लक्ष्य user_id 1 के साथ 3 आइटम समान थे।