Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pemfilteran kolaboratif di MySQL?

Buat tabel dan masukkan data pengujian:

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

Gabungkan data uji ke dirinya sendiri dengan book_id, dan buat tabel sementara untuk menampung setiap user_id dan jumlah buku yang sama dengan 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)

Kita dapat melihat bahwa user_id memiliki 3 kesamaan dengan user_id 1, tetapi user_id 3 dan user_id 4 hanya memiliki 1 masing-masing.

Selanjutnya, pilih semua buku yang dimiliki pengguna di tabel sementara yang tidak cocok dengan buku target user_id, dan urutkan berdasarkan peringkat. Perhatikan bahwa buku yang sama mungkin muncul di daftar pengguna yang berbeda, jadi kami menjumlahkan peringkat untuk setiap buku sehingga buku umum mendapatkan peringkat yang lebih tinggi.

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)

Buku Z muncul dalam dua daftar pengguna, dan dengan demikian menduduki peringkat di atas X,Y,Q,W yang hanya muncul dalam satu daftar pengguna. Buku D melakukan yang terbaik karena muncul di daftar user_id 2, yang memiliki 3 item yang sama dengan 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. Cara Mendapatkan Data Penjualan 3 Bulan Terakhir di MySQL

  2. Laravel menggunakan klausa where pada metode withCount

  3. cara memasukkan data Google Analytics ke tabel mysql

  4. Cara membatasi nilai kolom di SQLite / MySQL

  5. Bagan silsilah/silsilah keluarga dari database