Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL/PHP:टैग/वर्गीकरण द्वारा समान/संबंधित आइटम खोजें

आप के बारे में प्रश्न करते हैं मैं कैसे गणना करूं कि कौन से शहर सबसे निकट से संबंधित हैं? उदाहरण के लिए। अगर मैं शहर 1 (पेरिस) देख रहा था, तो परिणाम इस प्रकार होने चाहिए:लंदन (2), न्यूयॉर्क (3) और आपके द्वारा प्रदान किए गए डेटा सेट के आधार पर केवल एक ही चीज़ है जो शहरों के बीच सामान्य टैग है, इसलिए जो शहर सामान्य टैग साझा करते हैं, वे नीचे सबसे नज़दीकी होंगे जो शहरों को ढूंढता है (इसके अलावा अन्य को प्रदान किया जाता है अपने निकटतम शहरों को खोजें) जो सामान्य टैग साझा करते हैं

SELECT * FROM `cities`  WHERE id IN (
SELECT city_id FROM `cities_tags` WHERE tag_id IN (
SELECT tag_id FROM `cities_tags` WHERE city_id=1) AND city_id !=1 )

कार्यरत

मुझे लगता है कि आप मेरे मामले में "पेरिस" में आईडी एक को खोजने के लिए शहर के आईडी या नाम में से एक को इनपुट करेंगे

 SELECT tag_id FROM `cities_tags` WHERE city_id=1

यह उन सभी टैग आईडी को ढूंढेगा जो पेरिस के पास हैं

SELECT city_id FROM `cities_tags` WHERE tag_id IN (
    SELECT tag_id FROM `cities_tags` WHERE city_id=1) AND city_id !=1 )

यह पेरिस को छोड़कर सभी शहरों को लाएगा जिसमें कुछ समान टैग हैं जो पेरिस में भी हैं

यह रहा आपका Fiddle

Jaccard समानता/सूचकांक के बारे में पढ़ते समय वास्तव में शर्तों के बारे में समझने के लिए कुछ चीजें मिलीं, आइए इस उदाहरण को लें, हमारे पास दो सेट ए और बी हैं

अब अपने परिदृश्य की ओर बढ़ें

यहां अब तक की क्वेरी है जो सही जेकार्ड इंडेक्स की गणना करती है जिसे आप नीचे देख सकते हैं बेला उदाहरण

SELECT a.*, 
( (CASE WHEN a.`intersect` =0 THEN a.`union` ELSE a.`intersect` END ) /a.`union`) AS jaccard_index 
 FROM (
SELECT q.* ,(q.sets + q.parisset) AS `union` , 
(q.sets - q.parisset) AS `intersect`
FROM (
SELECT cities.`id`, cities.`name` , GROUP_CONCAT(tag_id SEPARATOR ',') sets ,
(SELECT  GROUP_CONCAT(tag_id SEPARATOR ',')  FROM `cities_tags` WHERE city_id= 1)AS parisset

FROM `cities_tags` 
LEFT JOIN `cities` ON (cities_tags.`city_id` = cities.`id`)
GROUP BY city_id ) q
) a ORDER BY jaccard_index DESC 

उपरोक्त क्वेरी में मैंने अपने कस्टम गणना वाले उपनाम प्राप्त करने के लिए परिणाम को दो उप-चयनों में सेट किया है

आप उपरोक्त क्वेरी में फ़िल्टर जोड़ सकते हैं ताकि स्वयं के साथ समानता की गणना न की जा सके

SELECT a.*, 
( (CASE WHEN a.`intersect` =0 THEN a.`union` ELSE a.`intersect` END ) /a.`union`) AS jaccard_index 
 FROM (
SELECT q.* ,(q.sets + q.parisset) AS `union` , 
(q.sets - q.parisset) AS `intersect`
FROM (
SELECT cities.`id`, cities.`name` , GROUP_CONCAT(tag_id SEPARATOR ',') sets ,
(SELECT  GROUP_CONCAT(tag_id SEPARATOR ',')  FROM `cities_tags` WHERE city_id= 1)AS parisset

FROM `cities_tags` 
LEFT JOIN `cities` ON (cities_tags.`city_id` = cities.`id`) WHERE  cities.`id` !=1
GROUP BY city_id ) q
) a ORDER BY jaccard_index DESC

तो परिणाम दिखाता है कि पेरिस लंदन से निकटता से संबंधित है और फिर न्यूयॉर्क से संबंधित है

जैककार्ड समानता फिडल



  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 फ़ील्ड पर SQL LEFT-JOIN

  2. 40+ कॉलम के साथ mysql तालिका

  3. MySQL:किसी अन्य फ़ील्ड के आधार पर अनुक्रम कॉलम जोड़ें

  4. Mysql विभिन्न मूल्यों के लिए कई बार COL का चयन करें

  5. मैसकल एक्सएमएल टेबल एक्सपोर्ट कमांड लाइन