Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL- Sélection du produit le plus similaire

Essayez ceci

SELECT 
  a_product_id, 
  COALESCE( b_product_id, 'no_matchs_found' ) AS closest_product_match
FROM (
  SELECT 
    *,  
    @row_num := IF(@prev_value=A_product_id,@row_num+1,1) AS row_num,
    @prev_value := a_product_id
  FROM 
    (SELECT @prev_value := 0) r
    JOIN (
        SELECT 
         a.product_id as a_product_id,
         b.product_id as b_product_id,
         count( distinct b.Attributes ),
         count( distinct b2.Attributes ) as total_products
        FROM
          products a
          LEFT JOIN products b ON ( a.Attributes = b.Attributes AND a.product_id <> b.product_id )
          LEFT JOIN products b2 ON ( b2.product_id = b.product_id )
       /*WHERE */
         /*  a.product_id = 3 */
        GROUP BY
         a.product_id,
         b.product_id
        ORDER BY 
          1, 3 desc, 4
  ) t
) t2 
WHERE 
  row_num = 1

La query ci-dessus obtient les closest matches pour tous les produits, vous pouvez inclure le product_id dans la requête la plus interne, pour obtenir les résultats pour un product_id particulier , j'ai utilisé LEFT JOIN de sorte que même si un product n'a pas de correspondances, c'est affiché

SQLFIDDLE

J'espère que cela vous aidera