sql >> Database >  >> RDS >> Mysql

SQL- Het meest vergelijkbare product selecteren

Probeer dit

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

De bovenstaande query krijgt de closest matches voor alle producten kunt u de product_id in de binnenste zoekopdracht, om de resultaten te krijgen voor een bepaalde product_id , ik heb LEFT JOIN gebruikt zodat zelfs als een product heeft geen overeenkomsten, het wordt weergegeven

SQLFIDDLE

Ik hoop dat dit helpt



  1. Kun je PDO-voorbereiding weglaten als er geen tijdelijke aanduiding/dynamische gegevens in een query zijn?

  2. Postgresql - back-updatabase en herstel op andere eigenaar?

  3. Django Manytomany vraagt ​​raar gedrag

  4. Ontbrekende waarden in een MySQL-tabel interpoleren