आप के बारे में प्रश्न करते हैं मैं कैसे गणना करूं कि कौन से शहर सबसे निकट से संबंधित हैं? उदाहरण के लिए। अगर मैं शहर 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
तो परिणाम दिखाता है कि पेरिस लंदन से निकटता से संबंधित है और फिर न्यूयॉर्क से संबंधित है