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 में 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 आइटम समान थे।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. किसी अन्य क्वेरी से थोड़ी देर में दूसरी पीडीओ MySQL क्वेरी कैसे करें?

  2. Drupal डेटाबेस संरचना - कुशल/अक्षम?

  3. एक निश्चित समय के बाद MySQL रिकॉर्ड को कैसे डिलीट करें

  4. MySQL में पिछले 7 दिनों के रिकॉर्ड कैसे प्राप्त करें

  5. ग्रुप बाय वास्तव में क्या करता है?