Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lọc cộng tác trong MySQL?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Một mã chữ và số ngắn hơn không lặp lại so với UUID trong MySQL

  2. Loại bỏ hoặc cắt bớt một số ký tự đầu tiên hoặc cuối cùng trong cơ sở dữ liệu MySQL với SQL

  3. Mô phỏng MySql OLD_PASSWORD trong .NET hoặc MS SQL?

  4. Pymysql Chèn vào không hoạt động

  5. mysql lấy tên cột bảng theo thứ tự bảng chữ cái