Mysql
 sql >> база данни >  >> RDS >> Mysql

Съвместно филтриране в MySQL?

Създайте таблица и вмъкнете тестовите данни:

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 има 3 общи с user_id 1, но 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, който имаше 3 общи елемента с целевия 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. Грешка при импортиране на Python MySQLdb - Mac 10.6

  2. MySQL тригер при събития за вмъкване/актуализация

  3. Как да направя друга колона за автоматично увеличение на MySQL?

  4. Как да импортирате MySQL бази данни в командния ред

  5. Има ли някакъв начин автоматично да се създаде тригер при създаване на нова таблица в MySQL?