Bạn có câu hỏi về Làm cách nào để tính toán đâu là thành phố có liên quan chặt chẽ nhất? Ví dụ. Nếu tôi đang xem xét thành phố 1 (Paris), kết quả sẽ là:London (2), New York (3) và dựa trên tập dữ liệu được cung cấp của bạn, chỉ có một thứ liên quan đó là các thẻ chung giữa các thành phố, vì vậy các thành phố chia sẻ các thẻ chung sẽ là thành phố gần nhất bên dưới là truy vấn con tìm các thành phố (khác với các thành phố được cung cấp cho tìm các thành phố gần nhất của nó) có các thẻ chung
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 )
Đang làm việc
Tôi giả sử bạn sẽ nhập một trong các id hoặc tên thành phố để tìm tên hoặc id gần nhất của họ trong trường hợp của tôi là "Paris" có id là
SELECT tag_id FROM `cities_tags` WHERE city_id=1
Nó sẽ tìm thấy tất cả id thẻ mà paris có sau đó
SELECT city_id FROM `cities_tags` WHERE tag_id IN (
SELECT tag_id FROM `cities_tags` WHERE city_id=1) AND city_id !=1 )
Nó sẽ tìm nạp tất cả các thành phố ngoại trừ paris có một số thẻ giống như paris cũng có
Đây là Fiddle của bạn
Trong khi đọc về điểm giống / chỉ số Jaccard tìm thấy một số nội dung để hiểu về thực tế các điều khoản là gì, hãy lấy ví dụ này, chúng tôi có hai bộ A &B
Bây giờ hãy chuyển sang kịch bản của bạn
Đây là truy vấn cho đến nay sẽ phân loại chỉ mục jaccard hoàn hảo mà bạn có thể xem ví dụ fiddle dưới đây
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
Trong truy vấn trên, tôi có câu là tôi đã dẫn xuất tập kết quả thành hai lựa chọn con để lấy bí danh được tính toán tùy chỉnh của mình
Bạn có thể thêm bộ lọc trong truy vấn trên không để tính toán sự tương đồng với chính nó
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
Vì vậy, kết quả cho thấy Paris có liên quan chặt chẽ với London và sau đó là liên quan đến New York