Tạo bảng và chèn dữ liệu thử nghiệm:
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');
Kết hợp dữ liệu thử nghiệm vào chính nó bằng book_id và tạo một bảng tạm thời để chứa từng user_id và số lượng sách mà nó có chung với user_id đích:
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)
Chúng ta có thể thấy rằng user_id có 3 điểm chung với user_id 1, nhưng user_id 3 và user_id 4 chỉ có 1 điểm chung.
Tiếp theo, chọn tất cả các sách mà người dùng trong bảng tạm thời có không khớp với sách của user_id mục tiêu và sắp xếp chúng theo thứ hạng. Lưu ý rằng cùng một cuốn sách có thể xuất hiện trong các danh sách của người dùng khác nhau, vì vậy chúng tôi tổng hợp thứ hạng cho từng cuốn sách để những cuốn sách thông thường có thứ hạng cao hơn.
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)
Sách Z xuất hiện trong hai danh sách người dùng, và do đó, được xếp trên X, Y, Q, W chỉ xuất hiện trong danh sách của một người dùng. Sách D làm tốt nhất vì nó xuất hiện trong danh sách của user_id 2, có 3 điểm chung với target user_id 1.