Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL / PHP:Tìm các mục tương tự / có liên quan theo thẻ / phân loại

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

Jaccard Similarity Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sắp xếp theo nhiều cột với mysql

  2. mysql chọn giới hạn bên trong

  3. JDBC- không thể truy xuất giá trị và xóa bảng trong cơ sở dữ liệu mysql

  4. Danh sách các bảng không trống trong cơ sở dữ liệu MySQL

  5. Vấn đề về dấu đầu ra JSON